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

Pass a custom comparator through a function

本文关键字:自定义 比较器 函数      更新时间:2023-10-16

我有一个带函数的类

MyClass::doStuff(std::vector<MyCustomData*> toSort) { ...

我在其中打电话

std::sort(toSort.begin(), toSort.end(), MyClass::SortByZ());

myClass::SortByZ() 是一个自定义比较器。现在这有效,但我想实现以下目标:

我有几个类,每个类都应该有自己的比较器函子来对"MyCustomData"进行排序。所以例如1级...应该有

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::d oStuff(...)

doStuff(myData, Class1::SortData)

doStuff(myData, Class2::SortData)

函数 MyClass::d oStuff(...) 应该使用相应的排序顺序。

我没有找到这样做的方法,有吗?我想要一个简单的解决方案(不必支持模板或任何东西)。如果需要,我愿意使用 boost,但最好不要使用增强的解决方案。

我希望我能够描述我想要实现的目标?感谢您的任何帮助!

你必须

doStuff做一个模板:

template <typename Comparator>
void doStuff(std::vector<MyCustomData*> toSort, Comparator compare) {
   // ...
   std::sort(toSort.begin(), toSort.end(), compare);
   // ...
}

此外,它可能希望通过引用获取第一个参数。照原样,它将对参数的副本进行排序,丢弃该副本,并保持调用方的向量不变;虽然也许这就是你想要的。

使用函数模板,以便接受任何类型的比较函数(或函子):

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

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