CRTP: 動的ポリモーフィズムの代替手段
動的ポリモーフィズムは柔軟性を提供しますが、仮想の使用により実行時のオーバーヘッドが発生することがよくあります。メンバー関数。幸いなことに、C には、Curiously Recurring Template Pattern (CRTP) という効果的な代替手段が用意されています。
CRTP を使用すると、ポリモーフィズムに似た静的ディスパッチを実現できますが、仮想メンバー関数のオーバーヘッドはありません。これは、型の特殊化とテンプレートの推論によって実現されます。
方法 1: 静的なインターフェイスの仕様
派生型のインターフェイスを静的に指定することで、特定の動作を強制できます。コンパイル時間。たとえば、次のコード スニペットを考えてみましょう。
<code class="cpp">template <class Derived> struct base { void foo() { static_cast<Derived *>(this)->foo(); }; };</code>
このシナリオでは、base<>コンパイル用に foo() メンバー関数を定義するには、任意の派生型が必要です。 my_type や your_type などの各派生型は、この要件を満たすために独自の foo() 関数を実装する必要があります。
方法 2: コンパイル時の型推定
またはを使用すると、基本クラスへのポインターや参照の使用を回避し、コンパイル時に型のワイヤリングを実行できます。次のテンプレート関数を考えてみましょう:
<code class="cpp">template <class T> // T is deduced at compile-time void bar(base<T> &obj) { obj.foo(); // does static dispatch }</code>
この関数は、base
CRTP の利点
CRTP を利用すると、C で静的ポリモーフィズムを実現でき、オブジェクト指向設計の利点を維持しながら、動的ポリモーフィズムの欠点を回避できます。
以上がCRTP: 静的ディスパッチは C の動的ポリモーフィズムを置き換えることができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。