C++ STL:使用派生虚拟类作为 std::sort() 的"Strict Weak Ordering"

C++ STL: Using derived virtual class as "Strict Weak Ordering" for std::sort()

本文关键字:sort Strict Ordering Weak std STL 派生 虚拟 C++      更新时间:2023-10-16

我在使用std::sort()时遇到了瓶颈。我有一个纯虚拟类(命名为Compare),方法的调用者派生自(命名为MyComp)。我使用纯虚拟类作为我的API原型:

void Object::DoSort(Compare &comp) {
    std::sort(this->mKeys.begin(),this->mKeys.end(), comp);
}

调用者:

class MyComp: public Compare {
    bool operator()(const Row *r1, const Row *r2)  { ... }
} cmp;
...
obj->DoSort(cmp);

Linux上的c++编译器报错:"不能分配'Compare'类型的对象,因为'Compare'类型有抽象的虚函数"

即使我将Compare修改为简单的虚拟(而不是纯),std::sort()仍然调用Compare::operator()代码而不是MyComp::operator()

调用cmp(r1,r2)编译良好并返回正确的结果。

我一定是做错了什么,否则我不明白。请帮助!

std::sort(和其他STL函数)按值接受比较器对象,因此您的对象正在被复制,但派生部分(包括其vtbl)正在被"切掉"。

你可以用代理包装你的对象:

class Proxy
{
private:
    Compare &cmp;
public:
    Proxy(Compare &cmp) : cmp(cmp) {}
    bool operator()(const Row *r1, const Row *r2) { return cmp(r1, r2); }
};

...
MyCompare cmp = MyCompare();
std::sort(x.begin(), x.end(), Proxy(cmp));