gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:25:20 24 4
gpt4 key购买 nike

我使用 std::sort() 撞墙了。我有一个纯虚类(名为 Compare),方法的调用者派生自该类(名为 MyComp)。我将纯虚拟类用于我的 API 原型(prototype):

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 上的 g++ 编译器提示:“无法分配类型为‘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));

关于C++ STL:将派生虚拟类用作 std::sort() 的 "Strict Weak Ordering",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5875323/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com