次の関数の最も一般的な構文は何でしょうか。
template<IteratorType> void myFunction(const IteratorType& myIterator)
{
_ptr = &myIterator[0];
}
イテレータmyIterator(rawポインタにすることができます)を取り、目標はmyIterator
が指すオブジェクトのアドレスをrawポインタ_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)には、たとえばbool &
ではないreference
タイプがあります。あなたの場合、_ptr = &*myIterator
が適切なポインタ型であると仮定すると、割り当て_ptr
がこれをキャッチし、コンパイルが失敗します。