ExpertiDict

C++ · Avançado · Inglês · Técnico

CRTP

ˌsiː.ɑːɹ.tiː.ˈpiːsigla

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 x

Exemplos

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.

Veja também

Todos os termos de C++