Namensräume
Varianten
Aktionen

Curiously Recurring Template Pattern

Von cppreference.com
< cpp‎ | Sprache
 
 
C++ Sprache
Allgemeine Themen
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesch - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 

Das Curiously Recurring Template Pattern (CRTP) ist ein Idiom, bei dem eine Klasse X von einer Klassenschablone Y abgeleitet wird, die einen Schablonenparameter Z entgegennimmt, wobei Y mit Z = X instanziiert wird. Zum Beispiel:

template<class Z>
class Y {};
 
class X : public Y<X> {};

[bearbeiten] Beispiel

CRTP kann verwendet werden, um "polymorphismus zur Kompilierungszeit" zu implementieren, wenn eine Basisklasse eine Schnittstelle bereitstellt und abgeleitete Klassen diese Schnittstelle implementieren.

#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();
}

Ausgabe

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

[bearbeiten] Siehe auch

Explizite Objekt-Memberfunktionen (deduzieren von this) (C++23)
ermöglicht einem Objekt, einen auf sich selbst verweisenden shared_ptr zu erstellen
(Klassen-Template) [edit]
Hilfsklassen-Schablone zur Definition einer view unter Verwendung des Curiously Recurring Template Patterns
(Klassen-Template) [edit]

[bearbeiten] Externe Links

1.  CRTP durch Konzepte ersetzen? — Sandor Dragos Blog
2.  Das Curiously Recurring Template Pattern (CRTP) — Sandor Dragos Blog
3.  Das Curiously Recurring Template Pattern (CRTP) - 1 — Fluent{C++}
4.  Was das CRTP Ihrem Code bringen kann - 2 — Fluent{C++}
5.  Ein Implementierungshilfe für das CRTP - 3 — Fluent{C++}
6.  Was ist das Curiously Recurring Template Pattern (CRTP)? — SO