假设我有一个基类B
和两个派生类C
,D
。
如果我将C
和D
的对象放在向量中,我可以按类型对向量进行排序,方法是重载lessThan运算符以获取两个类型为B
的对象并执行必要的操作比较在那里。例如,我可以为每个类提供一个排序ID,并将其进行比较以确定C
是否在D
之前,反之亦然。
现在我们假设排序顺序是C
< D
。
假设我希望能够添加任意数量的派生类。现在虽然它仍然存在,C
< D
,但现在可能需要E
< C
< {{1} E
}}
因此,当我添加新的课程D
时,如何实现这样的可扩展排序顺序,而无需更改C
和D
?
答案 0 :(得分:1)
不完全是你问的问题,但是...如何在向量中添加一个带有排序ID和B
的对?
我的意思是......如果您为排序ID定义enum
enum idClass { isB, isC, isD };
和用于缩短代码的类型
using pib = std::pair<idClass, B>;
您可以按如下方式定义矢量
std::vector<pib> vpb;
添加记住正确ID的元素
vpb.emplace_back(isC, C{});
vpb.emplace_back(isD, D{});
并使用简单的lambda进行排序
std::sort(vpb.begin(), vpb.end(), [](pib const & p1, pib const & p2)
{ return p1.first < p2.first; });
当您添加其他课程E
时,您只需在isE
枚举中添加idClass
ID(在您喜欢的位置),而无需修改{{ 1}},B
或C
。
以下是一个完整的工作示例
D