Здравствуйте, Alexander Pazdnikov, Вы писали:
AP> Здравствуйте, Коллеги.
AP>Помогите, пожалуйста, перегрузить оператор сравнения для std::vector<boost::shared_ptr> чтобы сравнивались не указатели, а объекты по этим указателям.
Не надо так делать — проблем потом не оберешься.
Сделай отдельную функцию, которая будет этим заниматься.
Здравствуйте, Alexander Pazdnikov, Вы писали:
J>>Не надо так делать — проблем потом не оберешься. AP>Почему не надо так делать? AP>Какие проблемы могу огрести?
Потому что это принципиально разные вещи — равенство указателей и равенство того, на что они указывают.
А уж если ты такое делаешь на следующем уровне (контейнер указателей) — ты нарушаешь сразу кучу самоочевидных инвариантов (а.к.а. нарушение принципа Лисков).
Например, из того, что вектора равны, следует равенство всех элементов, а у тебя это не выполняется, если ты только не захочешь перегрузить заодно и оператор сравнения указателей, но это тоже очень плохо — у тебя указатели на разные типы начнут вести себя по-разному, и обобщенный код, если такой есть, перестанет работать.
AP>Сейчас использую в тестах, AP>BOOST_CHECK_EQUAL(orig_container, computed_container); AP>В случае перегрузки operator== пользуюсь ими стандартными способами.
Нарушение ODR не пугает?
Чтобы всех этих проблем избежать, лучше завернуть этот вектор в класс, у которого ты сделаешь все необходимые методы сравнения и чего угодно еще.
Этот класс будет новой сущностью, НЕ вектором, а стало быть, все рассуждения, применимые к вектору, к нему самому применимы уже не будут.
С другой стороны, вектор, который сидит внутри этого класса, останется нормальным вектором с обычной семантикой, и любой обобщенный код, работающий с векторами, будет правильно с ним работать.
Заодно (по моему собственному опыту), несмотря на то, что это выглядит поначалу просто как примитивная тонкая обертка над вектором, как только ты создашь этот класс, окажется, что в него еще много чего связанного можно запихнуть, а результирующий код станет намного чище, и это именно потому, что твоя основная сущность — это все-таки не вектор, раз у него понадобилось так неочевидно менять семантику.