Curiously Recurring Template Pattern
From cppreference.net
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> {};
` 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.
Exécuter ce 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(); }
Sortie :
D1::impl() D2::impl()
Voir aussi
Fonctions membres à objet explicite (déduction de
this
)
(C++23)
|
|
|
(C++11)
|
permet à un objet de créer un
shared_ptr
se référant à lui-même
(modèle de classe) |
|
(C++20)
|
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 |