Meta-programmer c'est analyser, modifier et generer du code à aprtir de code, et ce à la compilation. En c++, cela passe par le détournement des mécanismes de spécialisations et de résolutions de types et le fait que les templates C++ soit turing-complet et beta-reductibles. C'est une des pierres angulaires de la Programmation Générique ( http://www.generic-programming.org ) qui est une ensemble d'idiome bien plus puissant que le simple OO.
A quoi ça sert, à plein de chose. Et en premier lieu à écrire du code générique, réutilisable au niveau source en garantissant un bon typage, de bonnes performances car la totalité des trucs est résolue à la compilation et osuvent une interface humainement lisible et intuitive. En terme d'usages : le calcul de type complexe, la manipulation de structure à la volée (boost.Fusion), l'introspection de type (boost.traits), les Expressions Tempaltes qui ne sont que meta-prog (boost.proto) etc. En terme d'applications concrètes, je te renvois à ma liste de publications scientifiques 
mais en outre grâce à ça, y a des outils de parallélisations automatiques, de générations d'architectures matérielles, d'accès pervasives à des réseaux de capteurs etc.
Et à quoi ca sert AddPointer ? A avoir qqs choses de génériques pour passer de T à T* car si dans le cas général, y a pas d'astuce si T est une référence, T* n'existe pas. Au lieu de devoir prendre ce cas particulier en compte dans ton code, il te suffit d'utilsier systematiquement add_pointer<T>::type pour etre sur de pas faire de conneries.
Message édité par Joel F le 25-10-2009 à 07:52:23