Ответ 1
Вы можете разыменовать указатель, а затем взять адрес объекта.
template<IteratorType> void myFunction(const IteratorType& myIterator)
{
_ptr = &(*myIterator);
}
Каким будет наиболее общий синтаксис для следующей функции:
template<IteratorType> void myFunction(const IteratorType& myIterator)
{
_ptr = &myIterator[0];
}
Требуется итератор myIterator (он может быть необработанным указателем), и цель состоит в том, чтобы назначить адрес объекта, на который указывает myIterator
, на необработанный указатель _ptr
. В настоящее время я использую &myIterator[0]
, но я понял, что только итераторы произвольного доступа имеют оператор [].
Итак, есть ли синтаксис, который будет работать со всеми стандартными итераторами и указателями?
Вы можете разыменовать указатель, а затем взять адрес объекта.
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
является подходящим типом указателя, и вы получите сбой компиляции.