Namespaces
Variants

Curiously Recurring Template Pattern

From cppreference.net
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
constexpr (C++11)
consteval (C++20)
constinit (C++20)
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

Le Curiously Recurring Template Pattern est un idiome dans lequel une classe X dérive d'un modèle de classe Y , prenant un paramètre de modèle Z , où Y est instancié avec Z = X . Par exemple,

template<class Z>
class Y {};
class X : public Y<X> {};
**Note:** Le code C++ n'a pas été traduit conformément aux instructions, car il se trouve dans des balises `
` et contient des termes spécifiques au C++. Le code reste donc identique à l'original.

Exemple

Le CRTP peut être utilisé pour implémenter le "polymorphisme à la compilation", lorsqu'une classe de base expose une interface et que les classes dérivées implémentent cette 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(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();
}

Sortie :

D1::impl()
D2::impl()

Voir aussi

Fonctions membres à objet explicite (déduction de this ) (C++23)
permet à un objet de créer un shared_ptr se référant à lui-même
(modèle de classe)
classe modèle utilitaire pour définir une view , utilisant le motif de modèle récurrent curieux
(modèle de classe)

Liens externes

1. Remplacer CRTP par les concepts ? — Blog de Sandor Drago
2. Le Curiously Recurring Template Pattern (CRTP) — Blog de Sandor Drago
3. Le Curiously Recurring Template Pattern (CRTP) - 1 — Fluent { C ++ }
4. Ce que le CRTP peut apporter à votre code - 2 — Fluent { C ++ }
5. Un assistant d'implémentation pour le CRTP - 3 — Fluent { C ++ }
6. Qu'est-ce que le Curiously Recurring Template Pattern (CRTP) — SO