Générer par programmation des tableaux statiques au moment de la compilation en C
Étant donné la possibilité de définir des tableaux statiques au moment de la compilation en C, est-il possible de attribuer leurs valeurs par programmation à l'aide de techniques de métaprogrammation ?
Question 1 : Programmatique Affectation des valeurs du tableau
Oui, en utilisant les fonctionnalités C 0x, il est possible d'initialiser les éléments du tableau "par programme" au moment de la compilation. Prenons l'exemple suivant :
template<unsigned... args> struct ArrayHolder { static const unsigned data[sizeof...(args)]; }; template<unsigned... args> const unsigned ArrayHolder<args...>::data[sizeof...(args)] = { args... };
Question 2 : attribution sélective des valeurs du tableau
En supposant que le tableau contient des valeurs récurrentes à quelques exceptions près, il est possible d'attribuer sélectivement valeurs par programme :
template<size_t N, template<size_t> class F, unsigned... args> struct generate_array_impl { typedef typename generate_array_impl<N-1, F, F<N>::value, args...>::result result; }; template<template<size_t> class F, unsigned... args> struct generate_array_impl<0, F, args...> { typedef ArrayHolder<F<0>::value, args...> result; }; template<size_t N, template<size_t> class F> struct generate_array { typedef typename generate_array_impl<N-1, F>::result result; };
Utilisation du tableau avec des zéros récurrents sauf pour les éléments 2 et 3 :
template<size_t index> struct MetaFunc { enum { value = index == 2 || index == 3 ? index + 1 : 0 }; }; void test() { const size_t count = 7; typedef generate_array<count, MetaFunc>::result A; for (size_t i=0; i<count; ++i) std::cout << A::data[i] << "\n"; }
Bien que ces solutions soient limitées par la profondeur maximale d'instanciation des modèles, elles démontrent le potentiel de C 0x pour la création et l'initialisation de tableaux programmatiques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!