使用通用方法重载运算符

时间:2013-09-05 23:57:31

标签: c++

如何使用通用方法重载运算符? 我有这种情况:

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));

1 个答案:

答案 0 :(得分: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> >());