C ++, как сортировать динамически, используя лямбда-функции для вектора unique_ptrs? - PullRequest
1 голос
/ 20 сентября 2011

Итак, у меня есть 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 производных классах). Но я хочу посмотреть, смогу ли я держать вещи «объектно-ориентированными».

Есть мысли по поводу дизайна?
Спасибо.

Ответы [ 2 ]

3 голосов
/ 20 сентября 2011

Взгляните на главу 31, Создание виртуальных функций для более чем одного объекта в Скотте Мейерсе, Более эффективный C ++ .

Также попробуйте поискать по фразам двойная отправка и многократная отправка .

0 голосов
/ 21 сентября 2011

Хмм ... Я бы, наверное, использовал переопределение operator< с набором соответствующих вариантов.Это было бы тогда независимо от любой иерархии классов.Но, возможно, это не то, что вы хотите.

...