Curiously Recurring Template Pattern
From cppreference.com
C++
Feature test macros (C++20)
Concepts library (C++20)
Metaprogramming library (C++11)
Ranges library (C++20)
Filesystem library (C++17)
Concurrency support library (C++11)
Execution control library (C++26)
C++ language
General topics
Conditional execution statements
Iteration statements (loops)
Jump statements
Dynamic exception specifications (until C++17*)
noexcept
specifier (C++11) Exceptions
Namespaces
Types
Specifiers
User-defined (C++11)
Utilities
Attributes (C++11)
Types
Type alias declaration (C++11)
Casts
Memory allocation
Class-specific function properties
Special member functions
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
(C++20)
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++}