web-dev-qa-db-ja.com

渡されるイテレータタイプ/ポインタに関係なく、ポイントされた要素のアドレス

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

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

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

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

18
Vincent

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

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

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

20
BigBoss

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

_ptr = &*myIterator;

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

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

4
ecatmur