Curiously Recurring Template Pattern
From cppreference.com
C++
C++ language
| General topics | ||||||||||||||||
| Flow control | ||||||||||||||||
| Conditional execution statements | ||||||||||||||||
| Iteration statements (loops) | ||||||||||||||||
| Jump statements | ||||||||||||||||
| Functions | ||||||||||||||||
| Function declaration | ||||||||||||||||
| Lambda function expression | ||||||||||||||||
inline specifier | ||||||||||||||||
| Dynamic exception specifications (until C++17*) | ||||||||||||||||
noexcept specifier (C++11) | ||||||||||||||||
| Exceptions | ||||||||||||||||
| Namespaces | ||||||||||||||||
| Types | ||||||||||||||||
| Specifiers | ||||||||||||||||
| ||||||||||||||||
| Storage duration specifiers | ||||||||||||||||
| Initialization | ||||||||||||||||
| Expressions | ||||||||||||||||
| Alternative representations | ||||||||||||||||
| Literals | ||||||||||||||||
| Boolean - Integer - Floating-point | ||||||||||||||||
| Character - String - nullptr (C++11) | ||||||||||||||||
| User-defined (C++11) | ||||||||||||||||
| Utilities | ||||||||||||||||
| Attributes (C++11) | ||||||||||||||||
| Types | ||||||||||||||||
typedef declaration | ||||||||||||||||
| Type alias declaration (C++11) | ||||||||||||||||
| Casts | ||||||||||||||||
| Memory allocation | ||||||||||||||||
| Classes | ||||||||||||||||
| Class-specific function properties | ||||||||||||||||
| ||||||||||||||||
| Special member functions | ||||||||||||||||
| ||||||||||||||||
| Templates | ||||||||||||||||
| Miscellaneous | ||||||||||||||||
The Curiously Recurring Template Pattern is an idiom in which a class X derives from a class template Y, taking a template parameter Z, where Y is instantiated with Z = X. For example,
template<class Z> class Y {}; class X : public Y<X> {};
[edit] Example
CRTP may be used to implement "compile-time polymorphism", when a base class exposes an interface, and derived classes implement such interface.
Run this code
#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(); }
Output:
D1::impl() D2::impl()
[edit] See also
Explicit object member functions (deducing this) (C++23)
| |
| (C++11) |
allows an object to create a shared_ptr referring to itself (class template) [edit] |
| (C++20) |
helper class template for defining a view, using the curiously recurring template pattern (class template) [edit] |
[edit] External links
| 1. | Replace CRTP with concepts? — Sandor Drago's blog |
| 2. | The Curiously Recurring Template Pattern (CRTP) — Sandor Drago's blog |
| 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 |