Patrón de plantilla curiosamente recurrente (CRTP)
De cppreference.com
El patrón de plantilla curiosamente recurrente (o CRTP por sus siglas en inglés) es una expresión idiomática en la que una clase se deriva de una plantilla de clase
Y
, tomando un parámetro de plantilla Z
, donde Y
es instanciada con Z = X. Por ejemplo,
template<class Z>class Y {}; class X :public Y<X>{};
[editar]Ejemplo
CRTP puede usarse para implementar "polimorfismo en tiempo de compilación", cuando una clase base expone una interfaz, y las clases derivadas implementan tal interfaz.
Ejecuta este código
#include <cstdio> #ifndef __cpp_explicit_this_parameter // sintaxis tradicional template<class Derivada>struct Base {void nombre(){(static_cast<Derivada*>(this))->impl();}};struct D1 :public Base<D1>{void impl(){std::puts("D1::impl()");}};struct D2 :public Base<D2>{void impl(){std::puts("D2::impl()");}}; void test(){// Base<D1> b1; b1.nombre(); // comportamiento indefinido// Base<D2> b2; b2.nombre(); // comportamiento indefinido D1 d1; d1.nombre(); D2 d2; d2.nombre();} #else // sintaxis alternativa de C++23; https://godbolt.org/z/s1o6qTMnP struct Base {void nombre(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()");}}; void test(){ D1 d1; d1.nombre(); D2 d2; d2.nombre();} #endif int main(){ test();}
Salida:
D1::impl() D2::impl()
[editar]Véase también
(C++11) | Permite a un objeto crear un puntero compartido (shared_ptr ) refiriéndose a sí mismo. (plantilla de clase) |
(C++20) | Plantilla de clase auxiliar para definir una vista (view ), usando el patrón de plantilla curiosamente recurrente (CRTP). (plantilla de clase) |