Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

_ptr = &*myIterator;

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

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