La métaprogrammation est un sujet palpitant mais déstabilisant au premier abord.
D'un langage de programmation à l'autre, le support à ce niveau d'abstraction varie, et là où plusieurs langages permettent de la métaprogrammation surtout dynamique (avec réflexivité, métaclasses et autres mécanismes de ce genre), C++ offre des mécanismes de métaprogrammation axées vers la performance à l'exécution, donc accentuant le travail statique, fait à la compilation.
D'autres manoeuvres ont pour but d'enrichir les capacités d'extension et de spécialisation d'un programme. Par exemple, C++ offre (sur demande, car ce n'est pas gratuit) le Run Time Type Inference, ou RTTI, sur lequel repose entre autres le transtypage par dynamic_cast, et à partir duquel on peut obtenir un nom pour chaque type.
Une autre écriture, plus féconde, repose sur une approche inspirée de std::bind1st(), de STL (aujourd'hui déprécié, mais ça reste un chic exemple), qui permet de transformer une opération binaire (deux opérandes) en une opération unaire (un seul opérande) en liant le 1er paramètre à une valeur donnée (ou, ici, à un type donné). On aurait pu faire de même avec le 2e paramètre, évidemment. Ce faisant, il devient possible de réduire le savoir requis par la fonction évaluant les comparaisons de type. Pour les fins de l'exemple proposé ici, le foncteur statique binaire transformé en foncteur statique unaire est meme_type (voir le programme principal, plus bas, pour un exemple d'utilisation). |
|
L'un des très beaux exemples de métaprogrammation est donné par les listes de types, que nous utiliserons un peu plus bas. |
|
Un algorithme statique simple pour trouver un type donné dans une liste de types est exprimé à droite. |
|
Un algorithme statique équivalent, mais plus flexible car combinant un foncteur statique à titre de prédicat et un algorithme de recherche statique à l'aide d'un prédicat, est présenté à droite. Avec d'autres prédicats statiques, il deviendrait possible d'exprimer des recherches encore plus complexes. |
|
Les deux exemples d'« appels » aux algorithmes statiques de recherche présentés ici montrent que, pour le code client, les deux approches sont syntaxiquement équivalentes. évidemment, puisque le fruit de l'une comme de l'autre est une constante statique, les performances à l'exécution seront précisément les mêmes dans chaque cas. |
|
En espérant que le tout vous soit utile...