Curiously Recurring Template Pattern
From cppreference.com
Curiously Recurring Template Patternとは、クラスXがクラステンプレートYから派生し、テンプレートパラメータZを取り、YがZ = Xでインスタンス化されるイディオムです。例として、
template<class Z> class Y {}; class X : public Y<X> {};
[編集] 例
CRTPは、「コンパイル時ポリモーフィズム」を実装するために使用できます。この場合、基底クラスがインターフェースを公開し、派生クラスがそのインターフェースを実装します。
このコードを実行
#include <cstdio> #ifndef __cpp_explicit_this_parameter // Traditional syntax template <class Derived> struct Base { void name() { static_cast<Derived*>(this)->impl(); } protected: Base() = default; // prohibits the creation of Base objects, which is UB }; struct D1 : public Base<D1> { void impl() { std::puts("D1::impl()"); } }; struct D2 : public Base<D2> { void impl() { std::puts("D2::impl()"); } }; #else // C++23 deducing-this syntax struct Base { void name(this auto&& self) { self.impl(); } }; struct D1 : public Base { void impl() { std::puts("D1::impl()"); } }; struct D2 : public Base { void impl() { std::puts("D2::impl()"); } }; #endif int main() { D1 d1; d1.name(); D2 d2; d2.name(); }
出力
D1::impl() D2::impl()
[編集] 関連項目
明示的なオブジェクトメンバー関数 (thisの推論) (C++23) | |
| (C++11) |
オブジェクトが自身を参照する shared_ptr を作成できるようにします(クラステンプレート) |
| (C++20) |
Curiously Recurring Template Pattern を使用してviewを定義するためのヘルパークラステンプレート(クラステンプレート) |
[編集] 外部リンク
| 1. | CRTPをコンセプトで置き換える? — Sandor Dragoのブログ |
| 2. | The Curiously Recurring Template Pattern (CRTP) — Sandor Dragoのブログ |
| 3. | The Curiously Recurring Template Pattern (CRTP) - 1 — Fluent{C++} |
| 4. | What the CRTP can bring to your code - 2 — Fluent{C++} |
| 5. | An implementation helper for the CRTP - 3 — Fluent{C++} |
| 6. | What is the Curiously Recurring Template Pattern (CRTP) — SO |