En C++, la métaprogrammation avec des patrons permet d'initialiser une donnée comme un tableau ou une structure de données complexe. L'exemple suivant illustre le remplissage d'un tableau dont les 32 premières valeurs sont le carré de l'index, et les valeurs suivantes sont l'index.
Le template est utilisé pour faire calculer la valeur d'un élément du tableau:
template <int N> struct ValeurTab { enum { valeur = N > 32 ? N : N * N }; };
Comme dans l'exemple de factorielle, pour récupérer la 10ème valeur, il suffit d'écrire ValeurTab<10>::valeur Ainsi le remplissage d'un tableau se ferait ainsi:
int tab[] = { ValeurTab<0>::valeur, ValeurTab<1>::valeur, ValeurTab<2>::valeur /* ... */ }
Pour faciliter le remplissage d'un grand tableau, on peut utiliser des macros classiques:
#define REMPLIR_TAB1(I) ValeurTab<(I)>::valeur #define REMPLIR_TAB2(I) REMPLIR_TAB1((I)), REMPLIR_TAB1(I + 1) #define REMPLIR_TAB4(I) REMPLIR_TAB2(I), REMPLIR_TAB2(I + 2) #define REMPLIR_TAB8(I) REMPLIR_TAB4(I), REMPLIR_TAB4(I + 4) #define REMPLIR_TAB16(I) REMPLIR_TAB8(I), REMPLIR_TAB8(I + 8) #define REMPLIR_TAB32(I) REMPLIR_TAB16(I), REMPLIR_TAB16(I + 16) #define REMPLIR_TAB64(I) REMPLIR_TAB32(I), REMPLIR_TAB32(I + 32) #define REMPLIR_TAB128(I) REMPLIR_TAB64(I), REMPLIR_TAB64(I + 64) //...
Ainsi pour remplir un tableau de 100 éléments en respectant l'algorithme du patron de classe, il suffit d'écrire:
int tab[] = { REMPLIR_TAB64(0),REMPLIR_TAB32(64),REMPLIR_TAB4(64 + 32) };