2

我有一个有函数的类

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

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

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

4

2 回答 2

6

您将必须制作doStuff一个模板:

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

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

于 2012-04-20T11:59:27.247 回答
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());

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

于 2012-04-20T12:00:43.353 回答