Lo encuentro bastante útil, y es bastante ajustable para muchas tareas. Pero tengo que admitir que no veo mucho código CRTP en la naturaleza.
¿Es difícil de entender? ¿Son las funciones virtuales más fáciles en general? ¿No debería usarse en el 90% de los casos en que aparece la palabra clave virtual?
El simple hecho es que muchos, si no la mayoría, los usuarios de C ++ apenas pueden comprender que vectores mejor mallocy free, por lo tanto, el número que no solo puede apreciar sino implementar la metaprogramación avanzada de plantillas no es muy alto. Esto implica que incluso si fuera bueno para el 90% de las situaciones, lo vería en mucho menos, simplemente porque las personas no lo saben o cómo usarlo.
Sin embargo, las funciones virtuales no tienen ventajas, a saber, las funciones virtuales son mucho más fáciles de usar que el CRTP. Las plantillas de C ++ son conocidas por ser poco exigentes con prácticamente cualquier cosa y todo, y el modelo de inclusión apesta.
Sin embargo, [las funciones virtuales] son claramente más lentas y menos potentes. Por ejemplo, en este momento estoy escribiendo código usando el CRTP, donde heredas las sobrecargas del operador para usar con plantillas de expresión. No hay forma de que las funciones virtuales puedan hacer que eso funcione.
¿No es algo irónico que la característica del lenguaje que CRTP usa para evitar el uso de "virtual" sea un tanto pervertida sobre "virtualmente" cualquier cosa y todo?
Kaiserludi
6
WTL usa el CRTP. El navegador Chromium es un ejemplo bien conocido de software que usa WTL, por lo que diría que se usa "en la naturaleza".
¿Sobre el 90%? Eso definitivamente es una exageración. ¿Alguna vez has usado un contenedor de objetos polimórficos? Ese es un uso muy común del polimorfismo y no se puede hacer eso con CRTP porque Base<DerivedA>no es lo mismo que Base<DerivedB>.
Aquí hay razones por las que no se usa más ampliamente:
Es un truco
Como truco, no está garantizado que no tengas problemas cuando lo uses. El gran número de proyectos ha utilizado el material OO normal, y se sabe que funciona correctamente / los problemas son bien conocidos, el CRTP se encuentra en solo un pequeño número de proyectos y no hay datos disponibles
no hay una buena razón para usarlo; la mayoría de las razones ubicadas simplemente no son válidas
puede hacer que algunas cosas sean más complicadas
WTL usa el CRTP. El navegador Chromium es un ejemplo bien conocido de software que usa WTL, por lo que diría que se usa "en la naturaleza".
¿Sobre el 90%? Eso definitivamente es una exageración. ¿Alguna vez has usado un contenedor de objetos polimórficos? Ese es un uso muy común del polimorfismo y no se puede hacer eso con CRTP porque
Base<DerivedA>
no es lo mismo queBase<DerivedB>
.fuente
Aquí hay razones por las que no se usa más ampliamente:
fuente