La métaprogrammation statique (ou "métaprogrammation de modèle") 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 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 C++, quelles sont les meilleures sources (livres, sites Web, didacticiels en ligne, etc.)?
[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" de modèles C++: le guide complet par David Vandevoorder et Nicolai M. Josuttis, ISBN-13: 9780201734843.
Todd Veldhuizen a un excellent tutoriel ici .
Une bonne ressource pour la programmation C++ en général est Design C++ moderne par Andrei Alexandrescu, ISBN-13: 9780201704310. Ce livre mélange un peu de métaprogrammation avec d'autres modèles techniques. Pour la métaprogrammation en particulier, voir les sections 2.1 "Assertions au moment de la compilation", 2.4 "Mappage des constantes intégrales aux types", 2.6 "Sélection du type", 2.7 "Détection de la convertibilité et de l'héritage au moment de la compilation", 2.9 "NullType
et EmptyType
"et 2.10" Traits de type ".
La meilleure ressource intermédiaire/avancée que j'ai trouvée est Métaprogrammation de modèle C++ par David Abrahams et Aleksey Gurtovoy, ISBN-13: 9780321227256
Si vous préférez un seul livre, procurez-vous Modèles C++: le guide complet car c'est aussi la référence définitive pour les modèles en général.
Le livre d'Andrei Alexandrescu Modern C++ Design couvre une grande partie de cela et d'autres astuces pour un code C++ moderne rapide et efficace et est la base de la bibliothèque Loki .
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).
Modern C++ Design , un livre génial et un cadre de modèle de conception par Alexandrescu. Un mot d'avertissement, après avoir lu ce livre, j'ai cessé de faire du C++ et je me suis dit "Bon sang, je peux juste choisir un meilleur langage et l'obtenir gratuitement".
Deux bons livres qui me viennent à l'esprit sont:
C'est un domaine assez approfondi, donc un bon livre comme l'un d'eux est certainement 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 il fonctionne!
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 des modèles a commencé pour de vrai lors du premier atelier de programmation de modèles C++ en 2000, et de nombreux auteurs cités jusqu'ici y ont assisté. (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.
Modern C++ est l'une des meilleures introductions que j'ai lues. Il couvre des exemples réels utiles de métaprogrammation de modèle. Jetez également un œil à la bibliothèque associée Loki .
google Alexandrescu, Design C++ moderne: programmation générique et modèles de conception appliqués
Les papiers originaux de Veldhuizen étaient bons. Si vous voulez un livre entier, alors il y a le livre de Vandevoorde "C++ Templates Complete Guide". Et lorsque vous êtes prêt pour le cours de maîtrise, essayez la conception C++ moderne d'Alexandrescu.