Перегрузка оператора косвенности для соответствия оператору индекса?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Перегрузка оператора косвенности для соответствия оператору индекса?

Сообщение Anonymous »


Я пытаюсь написать класс, который ведет себя аналогично std::set - в том смысле, что все элементы уникальны, и добавление элемента, уже находящегося в наборе, ничего не делает - но элементы в наборе в произвольном порядке, например std::vector, а не в числовом/алфавитном порядке или в полной несортировке, как в std::unordered_set.

Я сделал это, используя в своем классе вместе std::vector и std::map. На самом деле у меня уже все работает так, как я хочу, и теперь я просто пытаюсь понять, как добавить некоторые перегрузки для более удобного доступа к элементам.

Вот минимальный пример того, что у меня есть на данный момент, сокращенный до части, имеющей отношение к вопросу:

template class MappedVector { публика: используя VECTOR = std::vector; частный: ВЕКТОР _vector = {}; публика: ВЕКТОР get() const { вернуть _вектор; } ValueType оператор[](индекс ptrdiff_t) const { вернуть get()[индекс]; } }; Метод get позволяет получить доступ к базовому std::vector, а оператор индекса позволяет получить доступ к элементам. Я не хочу, чтобы другой код имел прямой доступ к std::vector, поскольку непосредственное добавление к нему элементов приведет к его рассинхронизации с std::map, который я использую для его индексации, поэтому использование VECTOR вместо VECTOR& и ValueType вместо VECTOR здесь намеренно: я хочу вернуть копии из них и в для изменения элементов потребуется пройти через мои методы push и pop или оператор присваивания.

В любом случае, все работает нормально. Проблема связана с оператором косвенности. Обычно для вектора следующие две строки кода эквивалентны:

std::string element = vec[1]; элемент = *(Век + 1); Я уже реализовал первое, но ломаю голову, какие перегрузки мне нужно использовать, чтобы получить второе. Следующее компилируется:

ValueTypeoperator*() const { вернуть get()[0]; } Но это разрешает доступ только к первому элементу. Поэтому я не могу добавить его к указателю, чтобы получить другой элемент, как в примере кода выше. Если я заменю его тем, что считаю правильным:

ValueTypeoperator*() const { вернуть *получить(); } Теперь я получаю следующую ошибку компиляции:

Ошибка C2676, двоичная '+': 'MAPPED_VECTOR' не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора

Я считаю, что мне нужно перегрузить операторы ++ и --, чтобы это работало, но как именно мне их перенаправить, чтобы они работали с вектором, а не с this< /code> сам объект? На самом деле я не хочу использовать какую-либо версию _vector++ для вектора в моем классе, потому что это повлияет на все будущие доступы, а не только на текущий. Но, насколько я понимаю, оператор косвенности выполняется позже, так нужно ли мне каким-то образом сохранять результат сложения/вычитания?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»