所以我有一个std::vector<std::unique_ptr<Base>> vec
,我试图对它进行动态排序,鉴于Derived1与Derivedn之间存在逻辑比较(Derivedn总是> Derivedn-1>…> Derived1)(说n = 10左右)和每个Derivedx有它自己不同的比较与Derivedx。例如,考虑10位整数> 9位整数> 1位整数,但在每个派生类中53> 32(但我不排序整数)。
所以我可以这样写:
std::sort(vec.begin(), vec.end(),
[](std::unique_ptr<Base>& const a, std::unique_ptr<Base>& const b){
return *a<*b;}
然后在Base中,如果Base::operator<(const Base& b)
是不同的派生类,则对它们进行比较,如果它们与Derivedx::operator<(const Derivedx& d)
是相同的派生类,则转换为Derivedx。
然而,我认为有一种方法可以在派生类中自动给出适当的定义来比较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比较可能会更好。但我确实想看看我是否能保持"面向对象"。
对设计问题有什么想法吗?
谢谢。
请参阅Scott Meyers的 more Effective c++ 中的第31章,使函数相对于多个对象是虚的。
同样,试着搜索短语双重调度和多重调度。
嗯…我可能会使用一组相关的变体来覆盖operator<
。这样就可以独立于任何类层次结构。但也许这不是你想要的。