Sobes.tech
Middle+

Como se chama a expressão idiomática do polimorfismo estático em C++?

sobes.tech IA

Resposta da IA

Padrão de Modelo de Template Curiosamente Recorrente (CRTP), também conhecido como polimorfismo estático ou polimorfismo em tempo de compilação.

O princípio do CRTP baseia-se no fato de que a classe template Base usa como parâmetro de template ela mesma, sendo ao mesmo tempo a classe base para uma classe derivada Derived.

template <typename T>
class Base
{
public:
    void interfaceMethod()
    {
        // Chamada estática ao método 'implementationMethod'
        // em um objeto do tipo Derived (que é T)
        static_cast<T*>(this)->implementationMethod();
    }

    // Nenhuma necessidade de método virtual aqui
};

class Derived : public Base<Derived>
{
public:
    void implementationMethod()
    {
        // Implementação específica para Derived
        // ...
    }
};

Vantagens do CRTP em relação ao polimorfismo dinâmico (com funções virtuais):

  • Desempenho: As chamadas de funções são estáticas e resolvidas em tempo de compilação, evitando custos adicionais de tabela virtual.
  • Ausência de custos adicionais por funções virtuais: Não é necessário armazenar ou usar vptr/vtbl.
  • Tipo mais rigoroso: Os erros relacionados a incompatibilidades de tipos ou falta de implementação são detectados na compilação.

Desvantagens:

  • Necessidade de conhecer o tipo do descendente: A classe base deve ser uma template e "saber" o tipo da classe derivada.
  • Complexidade para iniciantes: O padrão pode ser menos intuitivo em comparação com herança clássica com funções virtuais.
  • Impossibilidade de trabalhar com coleções de diferentes tipos CRTP: Não é possível armazenar em um contêiner objetos de diferentes classes derivadas CRTP e chamá-los através de um ponteiro/enlace base.

Comparação com o polimorfismo dinâmico:

Aspecto CRTP (polimorfismo estático) Polimorfismo dinâmico (funções virtuais)
Resolução de chamada Em tempo de compilação Em tempo de execução
Desempenho Mais alto (sem custos vtbl) Menor (com custos vtbl)
Custos adicionais Sem vptr/vtbl Com vptr/vtbl
Flexibilidade (coleções) Não (não é possível trabalhar com tipos heterogêneos via ponteiro/enlace base comum) Sim (é possível trabalhar com tipos heterogêneos)
Detecção de erros Em tempo de compilação Em tempo de execução
Complexidade Mais alto para iniciantes Menor para iniciantes