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 回答