Meilleure introduction à la métaprogrammation de modèles C ++? [fermé]

112

La métaprogrammation statique (alias «métaprogrammation de modèles») est une excellente technique C ++ qui permet l'exécution de programmes au moment de la compilation. Une ampoule s'est éteinte dans ma tête dès que j'ai lu cet exemple de métaprogrammation canonique:

#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 l'on veut en savoir plus sur la métaprogrammation statique C ++, quelles sont les meilleures sources (livres, sites Web, didacticiels en ligne, peu importe)?

jwfearn
la source
43
ampoule allumée ou éteinte?
horseyguy
36
De. Certainement pas.
Thomas Eding

Réponses:

108

[Répondre à ma propre question]

Les meilleures introductions que j'ai trouvées jusqu'à présent sont le chapitre 10, "Métaprogrammation statique en C ++" de Programmation générative, méthodes, outils et applications par Krzysztof Czarnecki et Ulrich W. Eisenecker, ISBN-13: 9780201309775; et le chapitre 17, «Métaprogrammes» des modèles C ++: Le guide complet par David Vandevoorder et Nicolai M. Josuttis, ISBN-13: 9780201734843.

texte alternatif texte alternatif texte alternatif texte alternatif

Todd Veldhuizen a un excellent tutoriel ici .

Une bonne ressource pour la programmation C ++ en général est Modern C ++ Design par Andrei Alexandrescu, ISBN-13: 9780201704310. Ce livre mélange un peu de métaprogrammation avec d'autres techniques de template. Pour la métaprogrammation en particulier, voir les sections 2.1 "Assertions à la compilation", 2.4 "Mappage des constantes intégrales aux types", 2.6 "Sélection de type", 2.7 "Détection de la convertibilité et de l'héritage au moment de la compilation", 2.9 "NullType etEmptyType " et 2.10 "Traits de type ".

La meilleure ressource intermédiaire / avancée que j'ai trouvée est métaprogrammation de modèles C ++ par David Abrahams et Aleksey Gurtovoy, ISBN-13: 9780321227256

Si vous préférez un seul livre, obtenez les modèles C ++: le guide complet car c'est également la référence définitive pour les modèles en général.

jwfearn
la source
2
Le lien vers l'article de Todd Veldhuizen est devenu périmé.
John R. Strohm
1
lien corrigé maintenant, merci!
jwfearn
Le lien est à nouveau rompu!
Paul
1
Merci @jwfearn, j'ai lu l'article, même si j'ai trouvé cela plus intéressant: youtube.com/watch?v=Am2is2QCvxY (il comporte deux parties). Il s'agit d'une conférence de Walter E. Brown: Metaprogramming Modern Template: A Compendium
Paul
24

Le livre Modern C ++ Design d' Andrei Alexandrescu couvre beaucoup de ces astuces et d'autres pour un code C ++ moderne rapide et efficace et constitue la base du Loki bibliothèque .

Il convient également de mentionner les bibliothèques Boost , qui utilisent fortement ces techniques et sont généralement de très haute qualité pour apprendre (bien que certaines soient assez denses).

Alaric
la source
12

Modern C ++ Design , un livre brillant et un framework de modèles de conception par Alexandrescu. Un mot d'avertissement, après avoir lu ce livre, j'ai arrêté de faire du C ++ et j'ai pensé "Que diable, je peux simplement choisir un meilleur langage et l'obtenir gratuitement".

Florian Bösch
la source
5
"Que diable, je peux juste choisir une meilleure langue et l'obtenir gratuitement" Ummm, qu'est-ce que tu veux dire? Je suis particulièrement confus par «gratuitement». Et quelle autre langue aviez-vous en tête?
Pop Catalin
12
La métaprogrammation de modèles C ++ vous offre toutes sortes de nouvelles capacités comme passer des types ou une liste de types comme arguments, etc. La plupart de ces capacités sont présentes dans des langages typés dynamiquement comme python, avec une syntaxe plus agréable.
Florian Bösch
1
Si vous recherchez un langage dans lequel vous pouvez écrire rapidement des programmes corrects, Python est meilleur que C ++. Si vous avez besoin de certains des autres éléments fournis par C ++, ajouter des capacités de type Lisp à C ++ peut être mieux que d'essayer de C ++ - si vous utilisez un autre langage.
David Thornley
6

Deux bons livres qui me viennent à l'esprit sont:

  • Design C ++ moderne / Andrei Alexandrescu (il a en fait 7 ans malgré le nom!)
  • Modèles C ++: le guide complet / Vandevoorde & Josuttis

C'est un domaine assez approfondi, donc un bon livre comme celui-ci est définitivement recommandé sur les sites Web. Certaines des techniques les plus avancées vous permettront d'étudier le code pendant un certain temps pour comprendre comment elles fonctionnent!

Nik
la source
5

Le C ++ moderne est l'une des meilleures introductions que j'ai lues. Il couvre des exemples utiles de métaprogrammation de modèles. Jetez également un œil à la bibliothèque compagnon Loki .

Éclipse
la source
5

Il n'y aura pas une grande liste de livres, car la liste des personnes ayant beaucoup d'expérience est limitée. La métaprogrammation de modèles a commencé pour de vrai autour du premier atelier de programmation de modèles C ++ en 2000, et de nombreux auteurs cités jusqu'à présent y ont participé. (IIRC, Andrei ne l'a pas fait.) Ces pionniers ont grandement influencé le domaine, et fondamentalement ce qui devrait être écrit est maintenant écrit. Personnellement, je conseillerais Vandevoorde & Josuttis. Alexandrescu est un livre difficile si vous êtes nouveau dans le domaine.

MSalters
la source
4

Les papiers originaux de Veldhuizen étaient bons. Si vous êtes prêt pour un livre entier, alors il y a le livre de Vandevoorde "Guide complet des modèles C ++". Et lorsque vous êtes prêt pour le cours de maîtrise, essayez la conception moderne C ++ d'Alexandrescu.

Eduffy
la source
4

google Alexandrescu, Conception C ++ moderne: programmation générique et modèles de conception appliqués

Maxime Ananyev
la source