2008-09-21 11 views
104

La metaprogramación estática (también conocida como "metaprogramación de plantillas") es una excelente 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 metaprogramming canónica:¿Mejor introducción a la metaprogramación de plantillas C++?

#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 metaprogramming estática C++, ¿cuáles son las mejores fuentes (libros, sitios web, cursos en línea , lo que sea)?

+40

¿La bombilla se apagó o se encendió? – horseyguy

+32

Off. Definitivamente fuera. –

Respuesta

99

[responder a mi propia pregunta]

Los mejores introducciones que he encontrado hasta ahora son el Capítulo 10, "Static metaprogramming 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, "Metaprograms" de plantillas de C++: La guía completa por David Vandevoorder y Nicolai M. Josuttis, ISBN-13: 9780201734843.

alt text http://ak.buy.com/db_assets/prod_images/941/30676941.jpgalt text http://ak.buy.com/db_assets/prod_images/235/31025235.jpgalt text http://ak.buy.com/db_assets/prod_images/704/30680704.jpgalt text http://ak.buy.com/db_assets/prod_images/218/39856218.jpg

Todd Veldhuizen tiene un excelente tutorial here .

Un buen recurso para la programación C++, en general, es Moderno C++ Diseño por Andrei Alexandrescu, ISBN-13: 9780201704310. Este libro mezcla un poco de metaprogramming con otras técnicas de plantilla. Para metaprogramación en particular, consulte las secciones 2.1 "Afirmaciones 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 "NullType y EmptyType" y 2.10 " Escriba rasgos ".

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

Si prefiere un solo libro, obtener plantillas C++: La Guía completa ya que también es la referencia definitiva para plantillas en general.

+2

El enlace a la obra de Todd Veldhuizen ha quedado obsoleto. –

+1

Creo que es esto: http://www10.informatik.uni-erlangen.de/~pflaum/pflaum/ProSeminar/meta-art.html – 0fnt

+1

enlace reparado ahora, gracias! – jwfearn

3

Google Alexandrescu, Moderno C++ Diseño: programación genérica y Patrones de Diseño Aplicado

4

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.

22

Andrei Alexandrescu's Modern C++ Design libro cubre una gran cantidad de este y otros trucos para el código C++ rápido y eficiente y es la base para la biblioteca Loki.

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

4

Los documentos originales de Veldhuizen eran buenos. Si desea un libro completo, 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 de C++ de Alexandrescu.

11

Modern C++ Design, un libro brillante y marco de patrón de diseño de Alexandrescu. Palabra de advertencia, después de leer este libro, dejé de hacer C++ y pensé "¿Qué diablos? Puedo elegir un idioma mejor y obtenerlo gratis".

+4

"¡Qué diablos, puedo elegir un idioma mejor y obtenerlo gratis" Ummm, ¿qué quieres decir? Estoy especialmente confundido por "gratis". ¿Y qué otro lenguaje tenías en mente? –

+11

La metaprogramación de plantillas C++ le brinda todo tipo de capacidades nuevas, como pasar tipos o lista de tipos como argumentos, etc. La mayoría de estas capacidades están presentes en lenguajes de tipo dinámico como python, con una sintaxis más agradable. –

+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++, puede ser mejor agregar Cype-like a C++ que intentar C++ - ify otro idioma. –

6

Dos buenos libros que vienen a la mente son:

  • Moderno C++ Diseño/Andrei Alexandrescu (En realidad es de 7 años a pesar del nombre!)
  • plantillas C++: The Complete Guide/Vandevoorde & Josuttis

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

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 forma real en torno al primer Taller de programación de plantillas de C++ en 2000, y muchos de los autores mencionados hasta el momento asistieron. (IIRC, Andrei no.) Estos pioneros influyeron mucho en el campo, y básicamente lo que debe escribirse ahora está escrito. Personalmente, recomendaría Vandevoorde & Josuttis. Alexandrescu es un libro difícil si eres nuevo en el campo.

Cuestiones relacionadas