所以我有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比較,但這可能會更好。但我確實想看看我能否保持「面向對象」的東西。
有關設計問題的任何想法?
謝謝。
多方法提案將其應用到語言中會很好。 –