所以我有一个std::vector<std::unique_ptr<Base>> vec
并且我正在尝试动态地对它进行排序,因为Derived1与Derivedn之间存在逻辑比较(Derivedn始终&gt; Derivedn-1&gt; ...&gt; Derived1)(比如n = 10左右)每个Derivedx都有自己与Derivedx的不同比较。例如,认为10位整数&gt; 9位整数&gt; 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&lt;动态导出。
我已经尝试了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)
在Scott Meyers的更有效的C ++ 中查看第31章使函数虚拟化多个对象。
另外,请尝试使用双重调度和多次调度这些短语进行Google搜索。
答案 1 :(得分:0)
嗯......我可能会使用一组相关的变体来覆盖operator<
。这将独立于任何类层次结构。但也许这不是你想要的。