suma son solamente saber que programa positivos positivo pida para números numeros numero negativos negativo los leer imprimir diga dfd determinar cuántos convertir como c++ templates

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 y for_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)
  • ¿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:


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:

  1. typedef ed typenames no heredan las clases de plantilla.
  2. La necesidad de esparcir palabras clave de typename y template en los lugares apropiados.
  3. 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.