2

CRTPは、virtual機能を完全に凌駕するのに十分な能力がありますか?

CRTPで私が目にする唯一の欠点は、繰り返し発生するパターンごとに生成されるコードの量が注目に値することです。小規模な設計(2〜3クラスがベースから派生している場合)の場合、CRTPの方が適していますか?

4

2 に答える 2

15

CRTP はランタイム ポリモーフィズムを提供しません。ランタイム ポリモーフィズムが必要な場合は、仮想メソッドが必要です。さらに悪いことに、基本クラスはテンプレート化されているため、サブクラス オブジェクトを基本クラスにキャストできないため、基本クラスと同じ型であるかのようにサブクラス オブジェクトを実際に使用することさえできません。それは単なるテンプレートです。

CRTP を置き換えるポリモーフィズムについてのより有用な考え方は、仮想継承の代わりとしてではなく、ミックスインの形式としてだと思います。通常の意味でサブクラスを作成しているわけではありません。代わりに、事前に作成された機能をクラスに追加しています。

ミックスインの例:ミックスインの例は、 depends-on のようなものです。このような mixin には、このアイテムが依存する同じタイプの他のアイテムへのポインターのリストが含まれる場合があります。register_dependency依存するオブジェクトを追加し、visit_dependentsすべての依存関係を(逆?) トポロジー順で訪問するメソッドもう 1 つの例は、メソッドを含むものにcompute_areaメソッドを追加するものです。または何でも...widthheight

これを型階層の代わりと考えると、本来の方法で機能しないコードを理解するのが難しくなり、デバッグするのが難しくなるだけです。パフォーマンスの向上が本当に必要でない限り (もしあれば — 保証されていません)、これは悪い考えのように思えます。余分なビットをすばやく接着するためにそれを行っているが、継承の概念的な重みがない場合は、問題ないと思います — いずれにせよ、「実際の」継承はそれほど頻繁には必要ありません。

于 2011-07-07T16:23:14.783 に答える
1

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.

于 2011-07-07T16:22:59.140 に答える