Адрес указанного элемента независимо от типа и указателя итератора

Какой будет наиболее общий синтаксис для следующей функции:

template<IteratorType> void myFunction(const IteratorType& myIterator)
{
    _ptr = &myIterator[0];
}

Требуется итератор myIterator (это может быть необработанный указатель), и цель состоит в том, чтобы назначить адрес объекта, на который указывает myIterator на необработанный указатель _ptr, В настоящее время я использую &myIterator[0] но я понял, что только итераторы с произвольным доступом имеют оператор [].

Так есть ли синтаксис, который будет работать со всеми типами стандартных итераторов и указателей?

4 ответа

Решение

Вы можете разыменовать указатель и затем взять адрес объекта.

template<IteratorType> void myFunction(const IteratorType& myIterator)
{
    _ptr = &(*myIterator);
}

В соответствии со стандартным оператором * вернуть ссылку, так что, на мой взгляд, лучший способ &*myIterator, но поскольку класс может быть перегружен оператором &, лучше всего std::addressof(*myIterator) это работает для всех классов

Все итераторы должны иметь operator * (24.2.2:2), так что вы можете написать

_ptr = &*myIterator;

Однако это недопустимо для выходных итераторов, где *r действительно только в левой части операции присваивания (24.2.4:2).

Также обратите внимание, что это не обязательно верно, что *r обеспечит значение, которое & может быть разумно применен к; специализация std::vector<bool> (23.3.7) имеет reference типа это не bool &, например. В вашем случае назначение _ptr = &*myIterator поймать это, предполагая, что _ptr является подходящим типом указателя, и вы получите ошибку компиляции.

Я надеюсь, что вы, ребята, сейчас живы. Если ваш итератор является итератором для std::vector, есть более удобный способ получить адрес, который держит итератор. Ты можешь использовать:

      auto *ptr = myIterator._Ptr;

Я надеюсь, что смогу дать правильный ответ на ваш вопрос.

Другие вопросы по тегам