通过函数传递自定义比较器

时间:2012-04-20 11:53:20

标签: c++ comparator

我有一个带功能的课程

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(...)应该使用相应的排序顺序。

我没有找到这样做的方法,有吗?我想要一个简单的解决方案(不必支持模板或任何东西)。如果我需要,我会愿意使用提升,但是没有提升的解决方案将是首选。

我希望我能够描述我想要实现的目标?谢谢你的帮助!

2 个答案:

答案 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());

这就是标准算法提供通用性的方法。