121 votes

Meilleure introduction à la métaprogrammation des modèles C++ ?

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

#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 en C++, quelles sont les meilleures sources (livres, sites Web, didacticiels en ligne, etc.) ?

48 votes

L'ampoule s'est éteinte ou s'est allumée ?

41 votes

Off. Définitivement éteint.

117voto

jwfearn Points 8813

[Répondant à ma propre question]

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

alt textalt textalt textalt text

Todd Veldhuizen a un excellent tutoriel ici .

Une bonne ressource pour la programmation C++ en général est Conception moderne du C++ 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 "Compile-Time Assertions", 2.4 "Mapping Integral Constants to Types", 2.6 "Type Selection", 2.7 "Detecting Convertibility and Inheritance at Compile Time", 2.9 " NullType et EmptyType "et 2.10 "Traits de caractère".

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

Si vous préférez un seul livre, prenez Modèles C++ : Le guide complet puisqu'il s'agit également de la référence définitive pour les modèles en général.

2 votes

Le lien vers l'article de Todd Veldhuizen n'est plus valable.

1 votes

2 votes

Lien corrigé maintenant, merci !

25voto

Alaric Points 649

Andrei Alexandrescu Conception moderne du C++ couvre une grande partie de ce sujet et d'autres astuces pour un code C++ moderne, rapide et efficace, et constitue la base de l'ouvrage intitulé Loki bibliothèque.

Il convient également de mentionner le Boost qui font un usage intensif de ces techniques et sont généralement de très bonne qualité pour l'apprentissage (bien que certaines soient assez denses).

11voto

Florian Bösch Points 12408

Conception moderne du C++ un livre brillant et un cadre de modèles de conception par Alexandrescu. Je vous préviens qu'après avoir lu ce livre, j'ai arrêté de faire du C++ et je me suis dit "Et puis zut, je peux choisir un meilleur langage et l'obtenir gratuitement".

6 votes

"Et puis zut, je peux 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 as-tu en tête ?

13 votes

La métaprogrammation par gabarit C++ offre toutes sortes de nouvelles possibilités, comme le passage de types ou de listes de types comme arguments, etc. La plupart de ces possibilités sont présentes dans les langages typés dynamiquement comme python, avec une syntaxe plus agréable.

1 votes

Si vous cherchez un langage qui vous permette d'écrire rapidement des programmes corrects, Python est meilleur que C++. Si vous avez besoin de certaines des autres fonctionnalités du C++, il vaut mieux ajouter des capacités de type Lisp au C++ que d'essayer d'unifier un autre langage en C++.

7voto

Nik Points 1052

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

  • Modern C++ Design / Andrei Alexandrescu (Il a en fait 7 ans, malgré son nom !)
  • Modèles C++ : Le guide complet / Vandevoorde & Josuttis

Il s'agit d'un domaine assez approfondi, aussi un bon livre comme celui-ci est définitivement recommandé par rapport aux sites web. Certaines des techniques les plus avancées vous obligeront à étudier le code pendant un certain temps pour comprendre comment elles fonctionnent !

5voto

MSalters Points 74024

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X