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.
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>.
Eis alguns motivos pelos quais não é usado mais amplamente:
É um hack
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
não há um bom motivo para usá-lo - a maioria dos motivos citados não são válidos
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 queBase<DerivedB>
.fonte
Eis alguns motivos pelos quais não é usado mais amplamente:
fonte