¿La mejor introducción a la metaprogramación de plantillas de C ++? [cerrado]

112

La metaprogramación estática (también conocida como "metaprogramación de plantilla") es una gran técnica de C ++ que permite la ejecución de programas en tiempo de compilación. Una bombilla se encendió en mi cabeza tan pronto como leí este ejemplo canónico de metaprogramación:

#include <iostream>
using namespace std;

template< int n >
struct factorial { enum { ret = factorial< n - 1 >::ret * n }; };

template<>
struct factorial< 0 > { enum { ret = 1 }; };

int main() {
    cout << "7! = " << factorial< 7 >::ret << endl; // 5040
    return 0;
}

Si uno quiere aprender más sobre la metaprogramación estática de C ++, ¿cuáles son las mejores fuentes (libros, sitios web, cursos en línea, lo que sea)?

jwfearn
fuente
43
¿Se apagó o se encendió la bombilla?
Horseyguy
36
Apagado. Definitivamente apagado.
Thomas Eding

Respuestas:

108

[Respondiendo a mi propia pregunta]

Las mejores introducciones que he encontrado hasta ahora son el capítulo 10, "Metaprogramación estática en C ++" de Programación generativa, métodos, herramientas y aplicaciones de Krzysztof Czarnecki y Ulrich W. Eisenecker, ISBN-13: 9780201309775; y el capítulo 17, "Metaprogramas" de plantillas de C ++: la guía completa de David Vandevoorder y Nicolai M. Josuttis, ISBN-13: 9780201734843.

texto alternativo texto alternativo texto alternativo texto alternativo

Todd Veldhuizen tiene un excelente tutorial aquí .

Un buen recurso para la programación en C ++ en general es Modern C ++ Design de Andrei Alexandrescu, ISBN-13: 9780201704310. Este libro mezcla un poco de metaprogramación con otras técnicas de plantilla. Para la metaprogramación en particular, consulte las secciones 2.1 "Aserciones en tiempo de compilación", 2.4 "Asignación de constantes integrales a tipos", 2.6 "Selección de tipo", 2.7 "Detección de convertibilidad y herencia en tiempo de compilación", 2.9 " NullTypey EmptyType" y 2.10 "Rasgos de tipo ".

El mejor recurso intermedio / avanzado que he encontrado es C ++ Template Metaprogramming de David Abrahams y Aleksey Gurtovoy, ISBN-13: 9780321227256

Si prefiere un solo libro, obtenga C ++ Templates: The Complete Guide, ya que también es la referencia definitiva para las plantillas en general.

jwfearn
fuente
2
El enlace a la pieza de Todd Veldhuizen se ha vuelto obsoleto.
John R. Strohm
1
enlace arreglado ahora, gracias!
jwfearn
¡El vínculo está roto de nuevo!
Paul
1
Gracias @jwfearn, leí el artículo, aunque me pareció más interesante: youtube.com/watch?v=Am2is2QCvxY (tiene dos partes). Es una charla de Walter E. Brown: Modern Template Metaprogramming: A Compendium
Paul
24

El libro Modern C ++ Design de Andrei Alexandrescu cubre muchos de estos y otros trucos para un código C ++ moderno rápido y eficiente y es la base de la biblioteca Loki .

También vale la pena mencionar las bibliotecas Boost , que utilizan mucho estas técnicas y suelen ser de muy alta calidad para aprender (aunque algunas son bastante densas).

Alaric
fuente
12

Modern C ++ Design , un libro brillante y un marco de patrones de diseño de Alexandrescu. Una advertencia, después de leer este libro dejé de hacer C ++ y pensé "Qué diablos, puedo elegir un idioma mejor y obtenerlo gratis".

Florian Bösch
fuente
5
"Qué diablos, puedo elegir un idioma mejor y obtenerlo gratis" Ummm, ¿qué quieres decir? Estoy especialmente confundido por "gratis". ¿Y qué otro idioma tenías en mente?
Pop Catalin
12
La metaprogramación de plantillas de C ++ le brinda todo tipo de capacidades nuevas, como pasar tipos o listas de tipos como argumentos, etc. La mayoría de estas capacidades están presentes en lenguajes tipados dinámicamente como Python, con una sintaxis más agradable.
Florian Bösch
1
Si está buscando un lenguaje en el que pueda escribir programas correctos rápidamente, Python es mejor que C ++. Si necesita algunas de las otras cosas que proporciona C ++, agregar una capacidad similar a Lisp a C ++ puede ser mejor que intentar C ++, si utiliza otro lenguaje.
David Thornley
6

Dos buenos libros que me vienen a la mente son:

  • Modern C ++ Design / Andrei Alexandrescu (¡en realidad tiene 7 años a pesar del nombre!)
  • Plantillas C ++: la guía completa / Vandevoorde & Josuttis

Es un campo bastante profundo, por lo que definitivamente se recomienda un buen libro como uno de estos en los sitios web. ¡Algunas de las técnicas más avanzadas harán que estudies el código durante algún tiempo para descubrir cómo funcionan!

Nik
fuente
5

Modern C ++ es una de las mejores introducciones que he leído. Cubre ejemplos útiles reales de metaprogramación de plantillas. También eche un vistazo a la biblioteca complementaria Loki .

Eclipse
fuente
5

No habrá una gran lista de libros, ya que la lista de personas con mucha experiencia es limitada. La metaprogramación de plantillas comenzó de verdad alrededor del primer Taller de programación de plantillas en C ++ en 2000, y muchos de los autores nombrados hasta ahora asistieron. (IIRC, Andrei no lo hizo). Estos pioneros influyeron mucho en el campo, y básicamente lo que debería escribirse ahora está escrito. Personalmente, aconsejaría a Vandevoorde & Josuttis. Alexandrescu's es un libro difícil si eres nuevo en el campo.

MSalters
fuente
4

Los papeles originales de Veldhuizen eran buenos. Si está interesado en un libro completo, entonces está el libro de Vandevoorde "Guía completa de plantillas de C ++". Y cuando esté listo para el curso de maestría, pruebe el diseño moderno en C ++ de Alexandrescu.

eduffy
fuente
4

google Alexandrescu, Modern C ++ Design: Programación genérica y patrones de diseño aplicados

Maxim Ananyev
fuente