Grid
型でテンプレート化された単純な2Dコンテナである古いクラスを掘り起こしました。1つを作成するには、次のようにします。
Grid<SomeType> myGrid (QSize (width, height));
私はそれを「Qt-ish」にしようとしました...たとえば、それはの観点からサイズ操作をQSize
行い、あなたはそれにインデックスを付けmyGrid[QPoint (x, y)]
ます。ブールマスクを取り、マスクビットが設定された要素に対して操作を実行できます。あなたの要素があればそれがあなたのためにQColor
生成することができるという専門分野もありQImage
ます。
しかし、私が採用した主要なQtイディオムの1つは、内部で暗黙的に共有することでした。これは、私が持っていたThinker-QtベースのプログラムのQColorベースのグリッドで非常に役立つことがわかりました。
しかし:-/私はたまたま次のようなものを書いた場合もありました:
Grid< auto_ptr<SomeType> > myAutoPtrGrid (QSize (width, height));
auto_ptr
私がC++11に移行したときunique_ptr
、コンパイラは当然のことながら文句を言いました。暗黙の共有には、必要に応じて同一のコピーを作成する機能が必要です...そして、auto_ptr
コピーと所有権の譲渡を混同することで、このバグを一掃しました。コピー不可能なタイプと暗黙の共有は単純に混ざり合うことはなく、unique_ptr
親切にも教えてくれます。
(注:のユースケースは、値ではなく参照によってグリッドを渡すため、実際には問題に気付かなかったことがありましたauto_ptr
。それでも、これは悪いコードでした...そしてCのプロアクティブな性質++ 11は、発生する前に潜在的な問題を指摘しています。)
では、暗黙の共有のオンとオフを切り替えることができる汎用コンテナをどのように設計すればよいでしょうか。を使用していたときに、グリッド機能の多くが本当に必要でした。auto_ptr
コピーできないタイプのコピーが無効になっていると、エラーが発生します。ただし、タイプがコピー可能である場合、デフォルトで暗黙的な共有が機能するのは便利です。
いくつかのアイデア:
- 私はあなたの好みに応じて別々のタイプ(
NonCopyableGrid
、CopyableGrid
)...または(UniqueGrid
、 )を作ることができます...Grid
Grid
コンストラクターにフラグを渡すことができます- 静的ファクトリメソッド(
Grid::newNonCopyable
、Grid::newCopyable
)を使用することもできますが、内部で関連するコンストラクターを呼び出すことになります...おそらくもっと説明的です - 可能であれば、含まれているタイプのコピー可能性を「検出」してから、実装でQSharedDataPointerを活用するかどうかに応じて、
これらの方法の1つを他の方法よりも選択する正当な理由はありますか、または人々はこの種の状況に完全に優れた方法を採用しましたか?