我有一个带功能的课程
MyClass::doStuff(std::vector<MyCustomData*> toSort) { ...
我打电话
std::sort(toSort.begin(), toSort.end(), MyClass::SortByZ());
myClass :: SortByZ()是一个自定义比较器。 现在这可行,但我想实现以下目标:
我有几个类,每个类都应该有自己的比较器函数来对“MyCustomData”进行排序。所以例如Class1 ......应该有
class Class1 {
struct SortData {
bool operator ()(MyCustomData *lhs, MyCustomData *rhs) {
return lhs->something1 > rhs->something1;
}
};
//...many more functions/vars
}
而Class2对于相同的数据类型具有不同的比较器函子,例如
class Class2 {
struct SortData {
bool operator ()(MyCustomData *lhs, MyCustomData *rhs) {
return lhs->something2 > rhs->something2;
}
};
//...many more functions/vars
}
现在我希望能够使用
调用函数MyClass :: doStuff(...)doStuff(myData, Class1::SortData)
或
doStuff(myData, Class2::SortData)
并且函数MyClass :: doStuff(...)应该使用相应的排序顺序。
我没有找到这样做的方法,有吗?我想要一个简单的解决方案(不必支持模板或任何东西)。如果我需要,我会愿意使用提升,但是没有提升的解决方案将是首选。
我希望我能够描述我想要实现的目标?谢谢你的帮助!
答案 0 :(得分:6)
您必须将doStuff
作为模板:
template <typename Comparator>
void doStuff(std::vector<MyCustomData*> toSort, Comparator compare) {
// ...
std::sort(toSort.begin(), toSort.end(), compare);
// ...
}
此外,它可能希望通过引用获取第一个参数。实际上,它会对参数的副本进行排序,丢弃该副本,并保持调用者的向量不受影响;虽然也许这就是你想要的。
答案 1 :(得分:3)
使用函数模板,以接受任何类型的比较函数(或仿函数):
template <typename Comparator>
void doStuff(std::vector<MyCustomData> toSort, Comparator comparator)
{
...
std::sort(toSort.begin(), toSort.end(), comparator);
...
}
...
doStuff(myData, Class1::SortData());
doStuff(myData, Class2::SortData());
这就是标准算法提供通用性的方法。