Namespaces
Variants
Actions

Curiously Recurring Template Pattern

From cppreference.com
< cpp‎ | language
 
 
C++ language
General topics
Conditional execution statements
Iteration statements (loops)
Jump statements
Exceptions
Namespaces
Types
Specifiers
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
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

allows an object to create a shared_ptr referring to itself
(class template) [edit]
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
Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/language/crtp&oldid=179840"

AltStyle によって変換されたページ (->オリジナル) /