c++ - 用于排序链表而不困惑的继承

标签 c++ linked-list polymorphism

我有一个看似简单的问题,但我找不到一个优雅的解决方案。

我正在使用需要排序两次的链表:

  • 一旦添加了一个参数作为列表元素,并且
  • 经过一些处理后在不同的参数上。

我存储在列表中的对象继承自抽象列表项基类。

问题在于求助于第二个参数。我不想在列表项基类中为它编写一个纯虚拟访问器,因为我后来在列表中存储了一些其他对象,这些对象也继承自列表项基类,但是第二个访问器对他们。

是否有我缺少的干净解决方案?

最佳答案

使用谓词:

std::list<Base*> myList; /* populate */

myList.sort([](Base * const p1, Base * const p2) -> bool
            { return static_cast<Derived*>(p1)->compare_with(*p2); }
           );

这假设在排序运行期间,所有元素实际上都是指向 Derived 的指针,它有一个返回成员函数 foo(甚至不需要是虚拟的)一个 bool 值。

当然,您可以按照自己喜欢的任何方式调整谓词的细节。如果您使用的是旧编译器,您还可以将 lambda 表达式替换为传统的拼写谓词类。

如果您不能确定您的所有元素实际上都是 Derived 类型,那么您可以使用 dynamic_cast 代替,但是您必须考虑一种订购所有无与伦比的对象的方法。在这种情况下,最好先将范围划分为 Derived 和非 Derived 的内容,然后只对前者进行排序。

关于c++ - 用于排序链表而不困惑的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10984222/

相关文章:

c++ - 如何将 std::string 传递给需要 char* 的函数?

c++ - 这个链表遍历有什么问题?

c++ - 多态类型的代理类,使用模板

java - 重写 toString() 是否会导致与重写普通方法不同的行为?

c++ - 存储可变参数模板的模板参数数量

c++ - 循环 vector vector 并附加到新 vector

c++ - 如何排除部分输入被解析?

java - Java中删除链表中的节点

c - 将一个链表指向另一个链表

c++ - 代数数据类型的惯用现代 C++ 是什么?