我有一个看似简单的问题,但我找不到一个优雅的解决方案。
我正在使用需要排序两次的链表:
- 一旦添加了一个参数作为列表元素,并且
- 经过一些处理后在不同的参数上。
我存储在列表中的对象继承自抽象列表项基类。
问题在于求助于第二个参数。我不想在列表项基类中为它编写一个纯虚拟访问器,因为我后来在列表中存储了一些其他对象,这些对象也继承自列表项基类,但是第二个访问器对他们。
是否有我缺少的干净解决方案?
最佳答案
使用谓词:
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/