2

一般的なアプローチを使用して演算子をオーバーロードするにはどうすればよいですか? 私はこの状況を持っています:

struct sortByDesc1 {
    bool operator() (const pair<int, int> &left, const pair<int, int> &right) {
        return left.second > right.second;
    }
};

演算子>を次のように変更します<

struct sortByAsc1 {
    bool operator() (const pair<int, int> &left, const pair<int, int> &right) {
        return left.second < right.second;
    }
};

pair<int, int>へのデータ型の小さな変更pair<float, float>

struct sortByDesc2 {
    bool operator() (const pair<float, float> &left, const pair<float, float> &right) {
        return left.second > right.second;
    }
};

使用例

vector< pair<int, int> > vec;
sort(vec.begin(), vec.end(), sortByAsc1());

ジェネリック関数が欲しいのですが、可能ですか? 例えば。:

# Abstracting
sort(vec.begin(), vec.end(), generic(asc, int));
4

1 に答える 1

1

テンプレートを使用します。

template<typename T1, typename T2=T1, bool Desc=False>
struct sortBySecond
{
    bool operator() (const std::pair<T1, T2> &l, const std::pair<T1, T2> &r)
    {
        bool ret=l.second<right.second;
        // since Desc is known at compile time, any decent compiler will optimize
        // away the conditional
        return Desc?!ret:ret;
    }
};

sort(vec.begin(), vec.end(), sortBySecond<int, int, False>());

@Kerrek SBで指摘されているように、カスタム比較ファンクターを許可するだけでなく、<必要に応じて逆にすることで、これをより一般的にすることができます。

template<typename T1, typename T2=T1, typename compFunc=std::less<T2> >
struct sortBySecondEx
{
    bool operator() (const std::pair<T1, T2> &l, const std::pair<T1, T2> &r)
    {
        bool ret=compFunc(l.second,right.second);
        return Desc?!ret:ret;
    }
};

// Ascending
sort(vec.begin(), vec.end(), sortBySecondEx<int, int, std::less<int> >());
// Descending
sort(vec.begin(), vec.end(), sortBySecondEx<int, int, std::greater<int> >());
于 2013-09-06T00:03:26.453 に答える