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 |