Pregunta

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 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)?

¿Fue útil?

Solución

[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. por Krzysztof Czarnecki y Ulrich W.Eisenecker, ISBN-13:9780201309775;y el capítulo 17, "Metaprogramas" de Plantillas C++:La guía completa por David Vandevoorder y Nicolai M.Josutti, ISBN-13:9780201734843.

alt text alt text alt text alt text

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 tipo", 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 prefieres un solo libro, consigue Plantillas C++:La guía completa ya que también es la referencia definitiva para plantillas en general.

Otros consejos

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

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

Diseño moderno en C++, un libro brillante y un marco de patrones de diseño de Alexandrescu.Una advertencia: después de leer este libro, dejé de usar C++ y pensé: "¿Qué diablos? Puedo elegir un lenguaje mejor y obtenerlo gratis".

Dos buenos libros que me vienen a la mente son:

  • Diseño moderno en C++ / 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 te harán estudiar el código durante algún tiempo para descubrir cómo funcionan!

C++ moderno Es una de las mejores introducciones que he leído.Cubre ejemplos útiles reales de metaprogramación de plantillas.Eche también un vistazo a la biblioteca complementaria. Loki.

No habrá una lista grande 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, recomendaría a Vandevoorde & Josuttis.El de Alexandrescu es un libro difícil si eres nuevo en este campo.

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

google Alexandrescu, Diseño moderno en C++:Patrones genéricos de programación y diseño aplicados

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top