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 | ||||||||||||||||
TheCuriously Recurring Template Pattern is an idiom in which a classX
derives from a class templateY
, taking a template parameterZ
, whereY
is instantiated withZ= X. For example,
template<class Z>class Y{}; class X:public Y<X>{};
CRTP may be used to implement "compile-time polymorphism", when a base class exposes an interface, and derived classes implement such interface.
#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(thisauto&& 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()
Explicit object member functions (deducingthis )(C++23) | |
(C++11) | allows an object to create ashared_ptr referring to itself(class template)[edit] |
(C++20) | helper class template for defining aview , using thecuriously recurring template pattern(class template)[edit] |
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 |