【发布时间】:2011-09-20 16:57:54
【问题描述】:
所以我有一个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,如果它们是相同的派生类,则与 Derivedx::operator<(const Derivedx& d) 进行比较。
但是,我认为有一种方法可以根据派生类中的适当定义自动比较 a 和 b,但由于编译错误,我无法实现它。我无法让 lambda 函数动态比较 Derivedx
我试过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 比较。但我确实想看看我是否可以保持“面向对象”。
对设计问题有什么想法吗?
谢谢。
【问题讨论】:
-
如果多方法提案能融入语言就好了。
标签: sorting lambda c++11 unique-ptr