所以我有一个std::vector<std::unique_ptr<Base>> vec
并且我正在尝试对其进行动态排序,因为 Derived1 与 Derivedn 之间存在逻辑比较(Derivedn always > 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,Derivedx::operator<(const Derivedx& d)
如果它们是相同的派生类。
但是,我认为有一种方法可以根据派生类中的适当定义自动将 a 与 b 进行比较,但由于编译错误,我无法实现它。我无法让 lambda 函数动态比较 Derivedx < Derived。
我试过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 比较可能会更好。但我确实想看看我是否可以保持“面向对象”。
对设计问题有任何想法吗?
谢谢。