¿Se usa mucho CRTP? y por qué es / no es? [cerrado]

11

Estoy pensando en un patrón de plantilla curiosamente recurrente .

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?

Descifrador
fuente

Respuestas:

8

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.

DeadMG
fuente
1
¿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>.

Tamás Szelei
fuente
-5

Aquí hay razones por las que no se usa más ampliamente:

  1. Es un truco
  2. 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
  3. no hay una buena razón para usarlo; la mayoría de las razones ubicadas simplemente no son válidas
  4. puede hacer que algunas cosas sean más complicadas
tp1
fuente
11
Seguramente no es un truco. El comportamiento está muy bien definido y se usa mucho.
DeadMG
55
Sí, todo STL es un gran truco.
Abyx
¿Puedes editar tu respuesta y explicar por qué es un truco?
Nick