2011-09-20 50 views
1

所以我有std::vector<std::unique_ptr<Base>> vec,我試圖動態地對它進行排序,因爲Derived1與Derivedn(Derivedn總是> Derivedn-1> ...> Derived1)(比如n = 10左右)之間存在邏輯比較每個Derivedx都有自己與Derivedx的不同比較。作爲一個例子,認爲10位整數> 9位數整數> 1位整數,但在每個派生類53> 32(但我不排序整數)。C++如何動態使用lambda函數爲unique_ptrs的向量進行排序?

所以我可以這樣做:

std::sort(vec.begin(), vec.end(), 
[](std::unique_ptr<Base>& const a, std::unique_ptr<Base>& const b){ 
    return *a<*b;} 

然後在基地,有一個函數Base::operator<(const Base& b)進行比較,如果它們是不同的派生類,並轉換爲Derivedx如果它們是相同與Derivedx::operator<(const Derivedx& d)如果他們是同樣派生。

但是,我認爲有一種方法可以自動比較a和b,並給出派生類中的適當定義,但由於編譯錯誤,我無法實現它。我無法獲得lambda函數來動態比較Derivedx < Derivedy。

我試過Base::operator<(const std::unique_ptr<Base>),然後用return *a<b來編譯錯誤,說我用了一個刪除的拷貝賦值操作符(我不明白,這個賦值在哪裏?)。一個抽象的虛擬Base::operator<(const Base& b)做了幾乎相同的事情,我現在正在做更多的工作,因爲我必須實現Derivedx::operator<(const Base& b)(對於每個Derivedx),然後拋出到(Derivedx)(如果它們相同)。

雖然我可以比較基類中的所有內容而不是在n個派生類中的n比較中實施n^2比較,但這可能會更好。但我確實想看看我能否保持「面向對象」的東西。

有關設計問題的任何想法?
謝謝。

+0

多方法提案將其應用到語言中會很好。 –

回答

3

看一看第31章,製作功能虛擬相對於在斯科特邁爾斯多個對象更有效的C++

另外,嘗試使用谷歌搜索短語雙派遣多派遣

0

嗯...我可能會用覆蓋operator<與一組相關的變種。這將獨立於任何類層次。但也許這不是你想要的。

相關問題