c++如何使用lambda函数对unique_ptrs向量进行动态排序



所以我有一个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<。这样就可以独立于任何类层次结构。但也许这不是你想要的。

相关内容

  • 没有找到相关文章

最新更新