如何使用通用方法重载运算符? 我有这种情况:
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));
答案 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> >());