solamente - ¿Cuáles son los puntos buenos y malos de las plantillas de C++?
que pida un numero y diga si es positivo o negativo (10)
Algunas personas odian las plantillas (yo lo hago) porque:
- En cuanto a la capacidad de mantenimiento, el uso incorrecto de las plantillas puede tener un efecto negativo diez veces más fuerte que la ventaja inicial del tiempo que se suponía que debían traer.
- En la pov de optimización, las optimizaciones del compilador que permiten no son nada en comparación con un algoritmo óptimo y el uso de subprocesos múltiples.
- En el tiempo de compilación, el uso incorrecto de las plantillas puede tener un efecto muy negativo en las fases de análisis, compilación y vinculación, cuando una declaración de plantilla mal escrita trae toneladas de declaraciones inútiles de parásitos en cada unidad de compilación (aquí es cómo 200 líneas de código pueden producir un .obj de 1Mb).
Para mí, las plantillas son como una motosierra con un lanzallamas integrado que también puede lanzar granadas. Una vez en mi vida puedo tener una necesidad específica de eso. Pero la mayoría del tiempo, uso un martillo regular y una sierra simple para construir cosas y estoy haciendo un buen trabajo de esa manera.
He estado hablando con amigos y algunos están completamente de acuerdo en que se deben usar las plantillas en C ++, otras están en desacuerdo.
Algunas de las cosas buenas son:
- Son más seguros de usar (tipo seguridad).
- Son una buena manera de hacer generalizaciones para las API.
¿Qué otras cosas buenas me puedes contar sobre las plantillas de C ++?
¿Qué cosas malas me puedes contar sobre las plantillas de C ++?
Edición: una de las razones por las que pregunto esto es que estoy estudiando para un examen y en este momento estoy cubriendo el tema de las plantillas de C ++. Así que estoy tratando de entender un poco más sobre ellos.
Buenos puntos: poderoso; Te permite:
- prescribir los atributos de tiempo de compilación y el cálculo
- Describir algoritmos genéricos y estructuras de datos.
- hacer muchas otras cosas que de otra manera serían repetitivas, aburridas y propensas a errores
- los hace en el idioma, sin macros (¡lo que puede ser mucho más peligroso y oscuro!)
Puntos malos: poderosos; Te permite:
- provocan errores en tiempo de compilación que son detallados, engañosos y oscuros (aunque no tan oscuros y confusos como las macros ...)
- crear diseños erróneos oscuros y peligrosos (aunque no tan fácilmente como macros ...)
- causa que el código se hinche si no tienes cuidado (¡al igual que las macros!)
Las plantillas aumentan enormemente el espacio de diseño viable, lo que no es necesariamente algo malo, pero las hace mucho más difíciles de usar. El código de la plantilla necesita mantenedores que entiendan no solo las características del idioma, sino también las consecuencias de diseño de las características del idioma; En términos prácticos, esto significa que muchos grupos de desarrolladores evitan todas las aplicaciones de C ++, excepto las aplicaciones más simples e institucionalizadas.
En general, las plantillas hacen que el lenguaje sea mucho más complicado (¡y difícil de implementar correctamente!). Las plantillas no fueron diseñadas intencionalmente para ser Turing-completas, pero de todos modos lo son, por lo tanto, aunque pueden hacer casi cualquier cosa, usarlas puede resultar más problemático de lo que vale.
El código reutilizable está hecho con plantilla. Su aplicación es acorde con el perfil de cada uno.
En el lado positivo, las plantillas de C ++:
Permitir la generalización del tipo.
Disminuye la cantidad de código redundante que necesitas escribir
Ayuda para construir código de tipo seguro
Son evaluados en tiempo de compilación.
Puede aumentar el rendimiento (como alternativa al polimorfismo)
Ayuda a construir bibliotecas muy potentes.
En el lado negativo:
Puede complicarse rápidamente si uno no tiene cuidado
La mayoría de los compiladores dan mensajes de error crípticos
Puede ser difícil de usar / depurar código altamente templado
Tener al menos una peculiaridad sintáctica (el operador >> puede interferir con las plantillas)
Ayuda a hacer que C ++ sea muy difícil de analizar
En general, se debe considerar cuidadosamente cuándo se deben usar las plantillas.
Las plantillas deben usarse con moderación.
"Impresionante de depurar" y "difícil de leer" no son buenos argumentos contra los buenos usos de las plantillas con buenas abstracciones.
Los mejores argumentos negativos irían hacia el hecho de que el STL tiene muchos "errores", y el uso de plantillas para los fines que el STL ya cubre es reinventar la rueda. Las plantillas también aumentan el tiempo de enlace, lo que puede ser una preocupación para algunos proyectos, y tienen una gran cantidad de idiosincrasias en su sintaxis que pueden ser arcanas para las personas.
Pero los aspectos positivos con la reutilización de códigos genéricos, los rasgos de tipo, la reflexión, los punteros inteligentes e incluso los metaprogramas a menudo superan a los negativos. De lo que tiene que estar seguro es de que las plantillas siempre se usan con cuidado y con moderación . No son la mejor solución en todos los casos y, a menudo, ni siquiera la segunda o tercera mejor solución.
Necesita personas con suficiente experiencia en escribirlos para que puedan evitar todos los escollos y tener un buen radar para saber cuándo las plantillas complicarán las cosas más que ayudar.
Las plantillas son un mecanismo muy poderoso que puede simplificar muchas cosas. Sin embargo, usarlos adecuadamente requiere mucho tiempo y experiencia, para decidir cuándo su uso es apropiado.
Para mí las ventajas más importantes son:
- Reducir la repetición de código (contenedores genéricos, algoritmos).
- Reduciendo la repetición de código avanzado (MPL y Fusion).
- polimorfismo estático (= rendimiento) y otros cálculos de tiempo de compilación
- diseño basado en políticas (flexibilidad, reutilización, cambios más fáciles, etc.)
- aumentar la seguridad sin costo (es decir, análisis de dimensión a través de unidades de refuerzo, aseveraciones estáticas, verificaciones de conceptos)
- Programación funcional (Phoenix), evaluación perezosa, plantillas de expresión (podemos crear lenguajes incorporados específicos del dominio en C ++, tenemos una gran biblioteca de Proto, tenemos Blitz ++)
- Otras herramientas y trucos menos espectaculares utilizados en la vida cotidiana:
- STL y los algoritmos (¿cuál es la diferencia entre
for
yfor_each
)? - bind, lambda (o Phoenix) (escribe código más claro, simplifica las cosas)
- Función Boost (facilita la escritura de devoluciones de llamada)
- Tuplas (¿Cómo hacer un hash genérico de una tupla? Utilice Fusion, por ejemplo ...)
- TBB (
parallel_for
y otros STL como algoritmos y contenedores)
- STL y los algoritmos (¿cuál es la diferencia entre
- ¿Te imaginas C ++ sin plantillas? Sí, puedo, en los primeros tiempos no podía usarlos debido a las limitaciones del compilador.
- ¿Escribirías en C ++ sin plantillas? No, ya que perdería muchas de las ventajas mencionadas anteriormente.
Desventajas:
- Tiempo de compilación (por ejemplo, lance Sprit, Phoenix, MPL y algo de Fusion y puede ir a tomar un café)
- Las personas que pueden usar y entender las plantillas no son tan comunes (y estas personas son útiles)
- Las personas que piensan que pueden usar y entender las plantillas son bastante comunes (y estas personas son peligrosas, ya que pueden hacer un infierno de su código. Sin embargo, la mayoría de ellas después de cierta educación / tutoría se unirán al grupo mencionado en el punto anterior)
- plantilla de soporte de
export
(falta de) - los mensajes de error podrían ser menos crípticos (después de algún aprendizaje, puede encontrar lo que necesita, pero aún así ...)
Recomiendo altamente los siguientes libros:
- Plantillas de C ++: la guía completa de David Vandevoorde y Nicolai Josuttis (introducción completa al tema de las plantillas)
- Diseño moderno de C ++. Programación genérica y patrones de diseño aplicados por Andrei Alexandrescu (esta es la forma menos conocida de usar plantillas para simplificar su código, facilitar el desarrollo y dar como resultado un código robusto a los cambios)
- Metaprogramación de plantillas en C ++ por David Abrahms y Aleksey Gutov (de nuevo, una forma diferente de usar las plantillas)
- Más C ++ Idioms de Wikilibros presenta algunas ideas agradables.
No veo como son difíciles de leer. Lo que es ilegible acerca de
vector <string> names;
¿por ejemplo? ¿Con qué lo reemplazarías?
Una de las desventajas que no he visto aún es las sutiles diferencias semánticas entre las clases regulares y las instancias de las plantillas de clase. Puedo pensar en:
-
typedef
ed typenames no heredan las clases de plantilla. - La necesidad de esparcir palabras clave de
typename
ytemplate
en los lugares apropiados. - Las plantillas de función miembro no pueden ser
virtual
.
Estas cosas generalmente se pueden superar, pero son un dolor.
Ventaja: se pueden crear tipos de datos genéricos.
Desventaja: Código hinchado
Mis 2c son bastante negativas.
Los tipos C ++ nunca fueron diseñados para realizar cálculos de tiempo de compilación. La noción de usar tipos para lograr objetivos computacionales es muy claramente un hackeo y, además, uno que nunca se buscó, sino que más bien se tropezó con
..
La recompensa por usar MP en tu código es el momento de satisfacción de haber resuelto un acertijo difícil. Hizo cosas en 100 líneas que de otro modo habrían tomado 200. Se abrió camino a través de mensajes de error incomprensibles para llegar a un punto donde si tuviera que extender el código a un nuevo caso, sabría la función exacta de la plantilla de 3 líneas para sobrecarga. Sus mantenedores, por supuesto, tendrían que invertir infinitamente más para lograr lo mismo.