質問

この実用化のために"奇経常パターンをテンプレート"?の"対象クラス"とえば一般的に示名付けられたという説得力のある例です。

役に立ちましたか?

解決

シミュレートされた動的バインディング。 階層的な利点の一部を保持しながら仮想関数呼び出しのコストを回避することは、現在取り組んでいるプロジェクトで実行できるサブシステムにとって大きな勝利です。

他のヒント

また、 mixins (つまり、機能を提供するために継承するクラスを意味する)に対しても特に役立ちます。このクラス自体は、操作している型を知る必要があります(したがって、テンプレートである必要があります)。

効果的なC ++ では、Scott MeyersがクラステンプレートNewHandlerSupport< T>を例として提供しています。これには、特定のクラスの新しいハンドラーをオーバーライドする静的メソッド(std :: set_new_handlerがデフォルトの演算子newに対して行うのと同じ方法)と、ハンドラーを使用する演算子newが含まれます。タイプごとのハンドラーを提供するために、親クラスは、それが動作しているタイプを知る必要があるため、クラステンプレートである必要があります。テンプレートパラメータは子クラスです。

これを使用するクラスごとに、現在のnew_handlerを格納する個別の静的データメンバーを使用して、NewHandlerSupportテンプレートを個別にインスタンス化する必要があるため、CRTPなしでは実際にこれを実行できませんでした。

明らかに全体の例は非常に非スレッドセーフですが、ポイントを示しています。

マイヤーズは、CRTPを「Do It For Me」と考えるかもしれないと示唆しています。一般に、これはすべてのミックスインに当てはまり、CRTPは、ミックスインクラスだけでなく、ミックスインテンプレートが必要な場合に適用されます。

スーパークラスに渡されるサブクラスタイプがメソッドの拡張時にのみ必要であると考えると、CRTPの好奇心が大幅に減ります。 したがって、すべてのタイプが定義されます。 シンボリックサブクラスタイプをスーパークラスにインポートするためのパターンが必要なだけですが、スーパークラスに関する限り、すべての正式なテンプレートパラメータタイプは定義によるため、単なる前方宣言です。

スーパークラスが派生型のオブジェクトを返すことができるように、特性型構造のサブクラスをスーパークラスに渡して、多少変更した形式で使用します。アプリケーションは、すべての汎用機能がスーパークラスに実装されている幾何学計算(ポイント、ベクトル、ライン、ボックス)のライブラリであり、サブクラスは特定のタイプを定義するだけです:CFltPointはTGenPointを継承します。また、CFGenPointはTGenPointの前に存在していたため、サブクラス化はこれをリファクタリングする自然な方法でした。

一般に、コンパイル時にのみ、実行時に派生クラスを選択する必要のない多態的なパターンに使用されます。これにより、実行時の仮想関数呼び出しのオーバーヘッドを節約できます。

実際のライブラリでCRTPを使用する場合は、ATLおよびWTL(wtl.sf.net)を参照してください。コンパイル時のポリモーフィズムのためにそこで広く使用されています。

このようなCマクロ:活かし、マクロを作成しない時に定義すが、当時はます。

#define CALL_THE_RIGHT_FOO foo()

ファイル:

static void foo() {
   // do file A thing
}
...
CALL_THE_RIGHT_FOO
...

ファイル:

static void foo() {
   // do file B thing
}
...
CALL_THE_RIGHT_FOO
...

テンプレートの使用パターンだけを記述できない"の右foo"は、親テンプレートの先送りを決定義のように右fooするまでにテンプレートのインスタンスを生成.を除き、この場合で、区別してクラスa::fooとClassB::foo値に基づいてTに含まれます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top