Итак, у меня есть 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, учитывая соответствующие определения в производных классах, но я не смог реализовать его из-за ошибок компиляции. Я не могу заставить лямбда-функцию динамически сравнивать Derivedx
Я попытался Base::operator<(const std::unique_ptr<Base>)
, а затем использовал return *a<b
для ошибки компилятора, сказав, что я использовал оператор присваивания удаленной копии (который я не понимаю, где это присваивание ??). Абстрактный виртуальный Base::operator<(const Base& b)
делает практически то же самое, что я делаю сейчас с большим количеством работы, потому что мне нужно реализовать Derivedx::operator<(const Base& b)
(для каждого Derivedx) и затем привести к (Derivedx), если они одинаковы.
Может быть, лучше, чтобы я сравнивал все в базовом классе, а не реализовывал n ^ 2 сравнений в (n сравнений в n производных классах). Но я хочу посмотреть, смогу ли я держать вещи «объектно-ориентированными».
Есть мысли по поводу дизайна?
Спасибо.