1

通常の反復子 (または同様の範囲またはビュー クラス) を対応する const_iterator から派生させることは良い習慣ですか?

その動機は、

  • コードを共有し、
  • イテレータ/ビューが大きい場合、変換を回避します。

例として、3D グリッドのビュー、つまりグリッドのセクションを考えてみましょう。1 つのポインタ、3 つのサイズ、および 2 ~ 3 のストライドを含み、合計で 384 バイトになります。

const バージョンと mutating バージョンには、多くの共通機能 (読み取り専用の 3D グリッドで実行できること) があります。

上記の例の反対の動機は、const ビューに const ポインターが含まれているため、変化するビューconst_castでそれを使用するか、非 const ポインターに同じアドレスを含む余分なフィールドを追加する必要があることです。

4

1 に答える 1

2

const_iterator と iterator の間に継承がある場合は、おそらく逆になるはずです。つまり、const iterator はナビゲートする基本的な機能を提供し、mutable iterator はターゲットを変更する機能を追加します (const_iterator 内部への保護されたアクセスを許可することによって実装されます)。

編集: 元の質問は、イテレーターから const_iterator を派生させることについて尋ねました。私と@David Rodriguezの両方がほぼ同時に指摘したので、それは悪い考えです。

const_iterator から iterator を導出する改訂された質問により、David のコメントが最良の回答を提供します。それは可能ですが、通常は良い考えではありません。

反対の質問として、この場合に継承を使用することにはどのような利点があると思いますか? 利点がある場合、iterator と const_iterator の両方が派生する共通の基本クラス (iterator_impl) を持つことは、同じ利点を提供しますか?

于 2015-03-02T21:27:07.370 に答える