C++ · Avançado · Inglês · Técnico
CRTP
Padrão em que uma classe herda de um template instanciado com ela mesma, como class D : Base<D>. Permite polimorfismo estático, resolvido na compilação, sem funções virtuais.
Onde usar
Usado para injetar funcionalidade comum, como operadores de comparação ou contagem de instâncias, sem custo de vtable. A base chama métodos da derivada com static_cast<Derived*>(this).
Em código
template <class D>
struct B {
void run() { static_cast<D*>(this)->f(); }
};
struct X : B<X> {
void f() { puts("x"); }
};
X{}.run(); // imprime xExemplos
We use CRTP to avoid the cost of virtual calls.
Usamos CRTP para evitar o custo de chamadas virtuais.
The base class calls the derived one through a static cast.
A classe base chama a derivada por um static cast.
Cuidado
Não dá para guardar objetos de derivadas diferentes numa mesma coleção pela base, pois cada Base<D> é um tipo distinto.
Sinônimos
polimorfismo estático
Antônimos
função virtual
Origem
Sigla de Curiously Recurring Template Pattern, padrão de template curiosamente recorrente.