¿Hay recursos sobre cómo identificar los problemas que podrían resolverse mejor con plantillas?

7

Decidí mejorar mi conocimiento en la meta-programación de plantillas. Conozco la sintaxis y las reglas y he estado jugando con innumerables ejemplos de recursos en línea.

Entiendo lo poderosas que pueden ser las plantillas y la optimización de tiempo de compilación que pueden proporcionar, pero todavía no puedo "pensar en plantillas", parece que no puedo saber por mí mismo si un determinado problema podría resolverse mejor con plantillas y si Puede, cómo adaptar ese problema a las plantillas.

¿Hay algún tipo de recurso o libro en línea que enseñe cómo identificar los problemas que podrían resolverse mejor con plantillas y cómo adaptar ese problema?

    
pregunta sap 28.11.2011 - 19:01

9 respuestas

8

Libros:

Diseño moderno de C ++

Metaprogramación de plantillas C ++

Estar familiarizado con la recursión y la programación funcional es una gran ventaja, ya que eso es lo que implica mucha tmp. Se está completando y, esencialmente, todo es posible, aunque generalmente se reduce a aplicar funciones puras a constantes o generar tipos de otros tipos.

Advertencia: tmp es un monstruo feo que convierte un buen código en espagueti. Cuanto más lo uses, menos te gustará C ++. Es una cosa malvada.

    
respondido por el Pubby 28.11.2011 - 19:12
6

Aprenda Haskell o algún otro lenguaje funcional puro (Lisp, Scheme, OCaml para nombrar algunos, puede encontrar más en Wikipedia ).

Teniendo en cuenta a Haskell, puedes encontrar más información sobre sus instalaciones de metaprogramación aquí .

La programación de plantillas sigue prácticamente las mismas reglas.

    
respondido por el Macke 28.11.2011 - 19:27
2

Solo porque puedas hacer algo con plantillas no significa que debas hacerlo. En términos prácticos, a menos que cuando esté diseñando, piense que este es un trabajo increíble para las plantillas, probablemente sea mejor no usarlas. Si piensas demasiado en las plantillas, simplemente creas un código increíblemente abstracto que es tan malo como una sola función gigante.

    
respondido por el Ryathal 28.11.2011 - 19:33
2

Tenga en cuenta que las plantillas que son la mejor solución es muy rara. Solo he definido el mío una vez en los últimos 5 años, y mis colegas que revisaron ese código nunca lo habían hecho. La mayoría de los casos en que las plantillas tienen mucho sentido ya se han implementado en bibliotecas estándar.

Para la programación genérica, lo importante a tener en cuenta es que está copiando y pegando funciones para hacer solo cambios menores, como constantes o tipos, y no puede encontrar una manera limpia de usar algo como la herencia o los parámetros de función. para evitar repetirte.

Una forma bastante común en que se usan las plantillas es para la seguridad de tipos, si tiene tipos que se comportan igual, pero por alguna razón no quiere que se mezclen accidentalmente.

Para el cálculo del tiempo de compilación utilizando plantillas, lo que hay que tener en cuenta son los cálculos de uso intensivo de recursos en los que se conocen todas sus entradas en el momento de la compilación, pero donde se utilizan diferentes entradas constantes en diferentes lugares a lo largo del código. Sin embargo, tenga en cuenta que esto ralentizará sus compilaciones cada vez, por lo que a menudo es preferible simplemente codificar los resultados manualmente, si no cambian muy a menudo.

Algunos defensores utilizan plantillas para microoptimizaciones, como evitar búsquedas de tablas virtuales mediante el uso de polimorfismo estático, o para desenrollar bucles, pero en mi opinión, la complejidad generalmente supera las ganancias de rendimiento a menos que su código sea muy crítico para el rendimiento.

    
respondido por el Karl Bielefeldt 28.11.2011 - 20:19
2

Básicamente, hay varias buenas razones para usar plantillas:

  1. Tiene una función o una clase que tiene la misma funcionalidad para diferentes tipos. Un buen ejemplo de buen uso de plantillas es la aumentar la biblioteca
  2. desea utilizar polimorfismo estático y obtener errores de compilación, en lugar de errores de tiempo de ejecución
  3. desea obtener un comportamiento específico en función de algunos parámetros estáticos. Por ejemplo, boost :: type_traits proporciona muy buena ejemplos.
respondido por el BЈовић 28.11.2011 - 20:23
1

¡Definitivamente deberías buscar plantillas en C ++! Esto lo ayudará enormemente a comprender temas como los patrones de diseño y la programación genérica. Compáralos con lo que otros idiomas te ofrecen. Precisamente, debe usar plantillas particularmente en los siguientes escenarios:

  1. Generalización & Reutilización de código
  2. flexibilidad
  3. Tiempo & Restricciones presupuestarias
  4. Falta de experiencia para una tarea determinada

Este es un buen recurso en línea para usted: enlace

    
respondido por el Maxood 28.11.2011 - 19:52
1

Un indicador simple de cuándo una plantilla mejoraría su código, es cuando ve que su código con frecuencia requiere que emita un objeto de un tipo diferente. Un ejemplo que encontré en mi propio código Java, que me llevó a convertir una firma de método existente en una plantilla:

    public MsgBase getLastSentMessage(Class<? extends MsgBase> msgBaseClass)

El código de mi cliente siempre se veía así:

    OrderResponse response = (OrderResponse) getLastSentMessage(OrderResponse.class);

y siempre que utilicé ese método, tuve que enviar el resultado a la subclase correcta del tipo MsgBase. La firma del método mejorado fue:

    public <T extends MsgBase> T getLastSentMessage(Class<T> clazz)

Ahora el código del cliente era:

     OrderResponse response = getLastSentMessage(OrderResponse.class);

Entonces, para resumir, si te encuentras haciendo muchos lanzamientos que parecen innecesarios, puedes tener un buen caso en el que una plantilla limpiará tu código.

Actualización: una mejor manera de generalizar la declaración anterior:

  

Cuando su clase de origen será utilizada por objetos de muchos tipos diferentes, y la clase de origen puede interactuar con esos tipos en un nivel más alto (más abstracto), pero sus clases de clientes desean interactuar con subtipos específicos, es un caso para el uso de plantillas. (Las clases de contenedor / lista son el ejemplo más conocido).

    
respondido por el Sam Goldberg 28.11.2011 - 20:38
0

Hoy mismo, utilicé plantillas para implementar una máquina de estados finitos para introducir algunas entradas. Las plantillas de expresiones son herramientas extremadamente poderosas para implementar conceptos de código como ese: se ejecutan como C ++ optimizado a mano y son obscenamente rápidos, pero muy genéricos y muy fáciles de escribir.

En términos generales, las plantillas tienen más sentido al implementar algoritmos genéricos. Si no está implementando un algoritmo genérico, no tienen mucho sentido.

    
respondido por el DeadMG 30.11.2011 - 00:25
0

Los usos más comunes de las plantillas son los siguientes:

std::vector<int> vec;
std::map<int, float> mymap;

El siguiente ejemplo común es:

template<class T>
class MyArray {
public:
   virtual T get(int i) const=0;
};

Junto con este tipo de uso:

class ArrayImpl : public MyArray<float> {
public:
     float get(int i) const { }
};

Esa muestra una parte importante de las plantillas, que es la sustitución de tipo: T se reemplaza por el tipo flotante en ambos lugares donde se usa.

    
respondido por el tp1 30.11.2011 - 01:25

Lea otras preguntas en las etiquetas