Mejor introducción a la metaprogramación de plantillas C++? [cerrado]


La metaprogramación estática (también conocida como "metaprogramación de plantillas") 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 en C++, ¿cuáles son las mejores fuentes (libros, sitios web, cursos en línea, lo que sea)?

Author: Georg Fritzsche, 2008-09-22

8 answers

[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 Generative Programming, Methods, Tools, and Applications de Krzysztof Czarnecki y Ulrich W. Eisenecker, ISBN-13: 9780201309775; y el capítulo 17, "Metaprogramas" de C++ Templates: The Complete Guide de David Vandevoorder and Nicolai M. Josuttis, ISBN-13: 9780201734843.

Texto alternativo http://ak.buy.com/db_assets/prod_images/941/30676941.jpg texto alternativo http://ak.buy.com/db_assets/prod_images/235/31025235.jpg texto alternativo http://ak.buy.com/db_assets/prod_images/704/30680704.jpg texto alternativo http://ak.buy.com/db_assets/prod_images/218/39856218.jpg

Todd Veldhuizen tiene un excelente tutorial aquí .

Un buen recurso para la programación en C++ en general es Diseño moderno en C++ por Andrei Alexandrescu, ISBN-13: 9780201704310. Este libro mezcla un poco de metaprogramación con otras técnicas de plantillas. 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 Tipos", 2.7" Detección de Convertibilidad y Herencia en Tiempo de Compilación", 2.9" NullType y EmptyType "y 2.10"Rasgos de tipo".

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

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

 102
Author: jwfearn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-08 16:08:15

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

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

 23
Author: Alaric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-04 17:13:26

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 mejor lenguaje y obtenerlo gratis".

 12
Author: Florian Bösch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-21 21:56:47

Dos buenos libros que vienen a la mente son:

  • Diseño C++ moderno / Andrei Alexandrescu (En realidad tiene 7 años a pesar del nombre!)
  • Plantillas de C++: La Guía completa / Vandevoorde & Josuttis

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

 6
Author: Nik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-21 21:59:23

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.

 5
Author: Eclipse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-21 21:54:51

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 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 es un libro difícil si eres nuevo en el campo.

 5
Author: MSalters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-21 22:40:25

Los documentos originales de Veldhuizen eran buenos. Si quieres un libro completo, entonces está el libro de Vandevoorde "C++ Templates Complete Guide". Y cuando estés listo para el curso de maestría, prueba el moderno diseño C++ de Alexandrescu.

 4
Author: eduffy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-21 21:56:39

Google Alexandrescu, Diseño C++ Moderno: Programación Genérica y Patrones de Diseño Aplicados

 4
Author: Maxim Ananyev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-21 23:01:33