O CRTP é muito usado? e por que é / não é? [fechadas]

11

Estou pensando no padrão curiosamente recorrente do modelo .

Acho isso bastante útil e é muito bem ajustável para muitas tarefas. Mas tenho que admitir, não vejo muito do código CRTP na natureza.

É difícil de entender? As funções virtuais são mais fáceis no geral? Não deve ser usado em 90% dos casos em que a palavra-chave virtual aparece?

Codificador
fonte

Respostas:

8

O fato simples é que muitos usuários de C ++, se não a maioria, mal conseguem entender o que vectoré melhor malloce free, portanto, o número que pode não apenas apreciar, mas implementar a metaprogramação avançada de modelos não é muito alto. Isso implica que, mesmo que fosse bom para 90% das situações, você o veria em muito menos, simplesmente porque as pessoas não sabem sobre ele ou como usá-lo.

No entanto, funções virtuais não têm vantagens, ou seja, funções virtuais são muito mais fáceis de usar do que o CRTP. Os modelos C ++ são notórios por serem desprezíveis em praticamente tudo e qualquer coisa, e o modelo de inclusão é péssimo.

No entanto, elas [funções virtuais] são claramente mais lentas e menos poderosas. Por exemplo, agora estou escrevendo código usando o CRTP, onde você herda sobrecargas de operador para usar com modelos de expressão. Não há como as funções virtuais possivelmente fazerem esse trabalho.

DeadMG
fonte
1
Não é um tanto irônico que o próprio recurso de linguagem que o CRTP usa para evitar o uso de 'virtual' seja insignificante em relação a 'praticamente' tudo e qualquer coisa?
Kaiserludi 12/09
6

WTL usa o CRTP. O navegador Chromium é um exemplo bem conhecido de software que usa WTL, então eu diria que é usado "em estado selvagem".

Cerca de 90%? Definitivamente, isso é um exagero. Você já usou um contêiner de objetos polimórficos? Esse é um uso muito comum do polimorfismo e você não pode fazer isso com o CRTP porque Base<DerivedA>não é o mesmo que Base<DerivedB>.

Tamás Szelei
fonte
-5

Eis alguns motivos pelos quais não é usado mais amplamente:

  1. É um hack
  2. Como hack, não é garantido que você não tenha problemas ao usá-lo. O material OO normal foi usado por um grande número de projetos e foi encontrado que funcionou corretamente / os problemas são bem conhecidos, o CRTP é encontrado em apenas um pequeno número de projetos e nenhum dado está disponível
  3. não há um bom motivo para usá-lo - a maioria dos motivos citados não são válidos
  4. pode tornar algumas coisas mais complicadas
tp1
fonte
11
Certamente não é um hack. O comportamento é muito bem definido, e há muito uso dele.
precisa saber é o seguinte
5
Sim, todo o STL é um grande truque.
Abyx
você pode editar sua resposta e explicar por que é um hack?
Nick