C++ STL:将派生虚拟类用作std :: sort()的"严格弱排序"

0x6*_*015 4 c++ sorting stl

我用std :: sort()打了一堵墙.我有一个纯虚拟类(命名Compare),方法的调用者派生自(命名MyComp).我将纯虚拟类用于我的API原型:

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

呼叫者,召集者:

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

Linux上的g ++编译器抱怨:"不能分配'Compare'类型的对象,因为'Compare'类型具有抽象虚函数"

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

调用cmp(r1,r2)编译正常并返回正确的结果.

我必须做错事,否则我就得不到.请帮忙!

Oli*_*rth 8

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));
Run Code Online (Sandbox Code Playgroud)