Re: Сравнение vector<shared_ptr>
От: jazzer Россия Skype: enerjazzer
Дата: 30.12.11 03:35
Оценка:
Здравствуйте, Alexander Pazdnikov, Вы писали:

AP> Здравствуйте, Коллеги.


AP>Помогите, пожалуйста, перегрузить оператор сравнения для std::vector<boost::shared_ptr> чтобы сравнивались не указатели, а объекты по этим указателям.


Не надо так делать — проблем потом не оберешься.
Сделай отдельную функцию, которая будет этим заниматься.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Сравнение vector<shared_ptr>
От: Alexander Pazdnikov  
Дата: 30.12.11 04:28
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Не надо так делать — проблем потом не оберешься.

J>Сделай отдельную функцию, которая будет этим заниматься.

Почему не надо так делать?
Какие проблемы могу огрести?

Сейчас использую в тестах,

BOOST_CHECK_EQUAL(orig_container, computed_container);

В случае перегрузки operator== пользуюсь ими стандартными способами.
Re[3]: Сравнение vector<shared_ptr>
От: jazzer Россия Skype: enerjazzer
Дата: 30.12.11 05:19
Оценка: 2 (1) +3
Здравствуйте, Alexander Pazdnikov, Вы писали:

J>>Не надо так делать — проблем потом не оберешься.

AP>Почему не надо так делать?
AP>Какие проблемы могу огрести?

Потому что это принципиально разные вещи — равенство указателей и равенство того, на что они указывают.
А уж если ты такое делаешь на следующем уровне (контейнер указателей) — ты нарушаешь сразу кучу самоочевидных инвариантов (а.к.а. нарушение принципа Лисков).
Например, из того, что вектора равны, следует равенство всех элементов, а у тебя это не выполняется, если ты только не захочешь перегрузить заодно и оператор сравнения указателей, но это тоже очень плохо — у тебя указатели на разные типы начнут вести себя по-разному, и обобщенный код, если такой есть, перестанет работать.

AP>Сейчас использую в тестах,

AP>BOOST_CHECK_EQUAL(orig_container, computed_container);
AP>В случае перегрузки operator== пользуюсь ими стандартными способами.

Нарушение ODR не пугает?

Чтобы всех этих проблем избежать, лучше завернуть этот вектор в класс, у которого ты сделаешь все необходимые методы сравнения и чего угодно еще.
Этот класс будет новой сущностью, НЕ вектором, а стало быть, все рассуждения, применимые к вектору, к нему самому применимы уже не будут.
С другой стороны, вектор, который сидит внутри этого класса, останется нормальным вектором с обычной семантикой, и любой обобщенный код, работающий с векторами, будет правильно с ним работать.

Заодно (по моему собственному опыту), несмотря на то, что это выглядит поначалу просто как примитивная тонкая обертка над вектором, как только ты создашь этот класс, окажется, что в него еще много чего связанного можно запихнуть, а результирующий код станет намного чище, и это именно потому, что твоя основная сущность — это все-таки не вектор, раз у него понадобилось так неочевидно менять семантику.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Сравнение vector<shared_ptr>
От: Alexander Pazdnikov  
Дата: 30.12.11 05:50
Оценка:
Здравствуйте, jazzer, Вы писали:

Большое Спасибо, очень развёрнуто. Так и сделаю.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.