Адрес указанного элемента независимо от типа и указателя итератора
Какой будет наиболее общий синтаксис для следующей функции:
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;
Я надеюсь, что смогу дать правильный ответ на ваш вопрос.