簡體   English   中英

C++ STL:使用派生的虛擬 class 作為 std::sort() 的“嚴格弱排序”

[英]C++ STL: Using derived virtual class as “Strict Weak Ordering” for std::sort()

我使用 std::sort() 撞牆了。 我有一個純虛擬 class (名為Compare ),方法的調用者來自(名為MyComp )。 我將純虛擬 class 用於我的 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 上的 g++ 編譯器抱怨說:“無法分配類型為 'Compare' 的 object,因為類型 'Compare' 具有抽象虛函數”

即使我將Compare修改為簡單的虛擬(不是純), std::sort()仍然調用Compare::operator()代碼而不是MyComp::operator()

調用 cmp(r1,r2) 可以很好地編譯並返回正確的結果。

我必須做錯事,否則我不明白。 請幫忙!

std::sort (和其他 STL 函數)按值獲取比較器對象,因此您的 object 正在被復制,但派生部分(包括其 vtbl)被“切掉”。

您可以將 object 包裝在代理中:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM