20

次の関数の最も一般的な構文は何でしょうか。

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

イテレータmyIterator(rawポインタの場合もあります)が必要であり、目標は、が指すオブジェクトのアドレスをrawポインタに割り当てることmyIteratorです_ptr。現在使用&myIterator[0]していますが、演算子[]を持つのはランダムアクセスイテレータだけであることに気付きました。

では、すべてのタイプの標準イテレーターとポインターで機能する構文はありますか?

4

4 に答える 4

36

ポインタを逆参照してから、オブジェクトのアドレスを取得できます。

template<IteratorType> void myFunction(const IteratorType& myIterator)
{
    _ptr = &(*myIterator);
}
于 2012-08-29T13:48:08.940 に答える
25

標準*によると、演算子は参照を返すので、私の意見では最良の方法はです&*myIteratorが、クラスが&演算子をオーバーロードする可能性があるため、最良の方法はstd::addressof(*myIterator)すべてのクラスで機能することです

于 2012-08-29T13:49:08.063 に答える
7

すべてのイテレータにはoperator *(24.2.2:2)が必要なので、次のように記述できます。

_ptr = &*myIterator;

ただし、これは*r、代入演算(24.2.4:2)の左側でのみ有効な出力イテレータには無効です。

また、賢明に適用できる*r値を提供することは必ずしも真実ではないことに注意してください。&特殊std::vector<bool>化(23.3.7)には、たとえば、referenceではないタイプがあります。あなたの場合、それが適切なポインタ型であると仮定するとbool &、割り当てはこれをキャッチし、コンパイルエラーが発生します。_ptr = &*myIterator_ptr

于 2012-08-29T13:49:08.003 に答える
2

皆さんが今生きていることを願っています。イテレータがのイテレータである場合、std::vectorイテレータが保持しているアドレスを取得するためのより良い方法があります。次を使用できます。

auto *ptr = myIterator._Ptr;

私はあなたの質問に適切な答えを与えることができると思います。

于 2021-06-24T10:23:45.000 に答える