C ++如何使用lambda函数动态地对unique_ptrs的向量进行排序?

时间:2011-09-20 16:57:55

标签: sorting lambda c++11 unique-ptr

所以我有一个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个比较。但我确实想知道我是否可以保持“面向对象”。

对设计问题的任何想法?
感谢。

2 个答案:

答案 0 :(得分:3)

在Scott Meyers的更有效的C ++ 中查看第31章使函数虚拟化多个对象

另外,请尝试使用双重调度多次调度这些短语进行Google搜索。

答案 1 :(得分:0)

嗯......我可能会使用一组相关的变体来覆盖operator<。这将独立于任何类层次结构。但也许这不是你想要的。