CRTPは、virtual
機能を完全に凌駕するのに十分な能力がありますか?
CRTPで私が目にする唯一の欠点は、繰り返し発生するパターンごとに生成されるコードの量が注目に値することです。小規模な設計(2〜3クラスがベースから派生している場合)の場合、CRTPの方が適していますか?
CRTPは、virtual
機能を完全に凌駕するのに十分な能力がありますか?
CRTPで私が目にする唯一の欠点は、繰り返し発生するパターンごとに生成されるコードの量が注目に値することです。小規模な設計(2〜3クラスがベースから派生している場合)の場合、CRTPの方が適していますか?
CRTP はランタイム ポリモーフィズムを提供しません。ランタイム ポリモーフィズムが必要な場合は、仮想メソッドが必要です。さらに悪いことに、基本クラスはテンプレート化されているため、サブクラス オブジェクトを基本クラスにキャストできないため、基本クラスと同じ型であるかのようにサブクラス オブジェクトを実際に使用することさえできません。それは単なるテンプレートです。
CRTP を置き換えるポリモーフィズムについてのより有用な考え方は、仮想継承の代わりとしてではなく、ミックスインの形式としてだと思います。通常の意味でサブクラスを作成しているわけではありません。代わりに、事前に作成された機能をクラスに追加しています。
ミックスインの例:ミックスインの例は、 depends-on のようなものです。このような mixin には、このアイテムが依存する同じタイプの他のアイテムへのポインターのリストが含まれる場合があります。register_dependency
依存するオブジェクトを追加し、visit_dependents
すべての依存関係を(逆?) トポロジー順で訪問するメソッドもう 1 つの例は、メソッドを含むものにcompute_area
メソッドを追加するものです。または何でも...width
height
これを型階層の代わりと考えると、本来の方法で機能しないコードを理解するのが難しくなり、デバッグするのが難しくなるだけです。パフォーマンスの向上が本当に必要でない限り (もしあれば — 保証されていません)、これは悪い考えのように思えます。余分なビットをすばやく接着するためにそれを行っているが、継承の概念的な重みがない場合は、問題ないと思います — いずれにせよ、「実際の」継承はそれほど頻繁には必要ありません。
Use whichever makes the design more clear and is easier to code/maintain. Unless you have a significant measured performance/space reason to pick one or the other, it's almost always better to just use the easiest way to code/debug/maintain.
With CRTP you have to have more template methods so it can act on the proper base class, which may or may not be a downside.