C ++ const правильность с помощью std :: pair - PullRequest
4 голосов
/ 05 января 2012

Я поддерживаю класс контейнера с интерфейсом, похожим на std::map / std::unordered_map.

Интерфейс утверждает, что хранит std::pair<const X,Y> (то есть, что такое value_type). Однако внутренне реализация хранит отсортированный массив std::pair<X,Y>.

Текущая реализация использует reinterpret_cast для реализации итераторов. У меня вопрос, есть ли лучшая альтернатива?

Переход к сохранению массива std::pair<const X,Y> был бы невозможен, поскольку реализация должна копировать элементы в массиве для реализации вставки и удаления. Один из способов сделать это - использовать std::sort.


Редактировать: Хотя я полагаю, что reinterpret_cast вызывает неопределенное поведение (или реализацию, определенную?), Я еще не сталкивался с компилятором, где это не работает - я ничего не волнуюсь?


Текущая реализация разыменования итератора:

template <class K, class M>
std::pair<const K,M>& operator*() {
  std::pair<K,M>& result = ...;
  return *reinterpret_cast<std::pair<const K,M>*)(&result);
}

Ответы [ 2 ]

2 голосов
/ 05 января 2012

Я считаю, что вы не можете решить эту проблему, возвращая std::pair.Вместо этого вам придется вернуть прокси-объект, который выглядит как как стандартная пара, но если вы обновите элемент second, он распространяется на основной контейнер, в то время как первый член открывается какconst по вашему желанию.

1 голос
/ 06 января 2012

"Лучшая альтернатива?"Что не так с reinterpret_cast?В этом случае приведение даже четко определено, поскольку вы выполняете приведение между объектами с совместимыми (фактически идентичными) представлениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...