Maison >développement back-end >C++ >La métaprogrammation C peut-elle être utilisée pour créer dynamiquement des tableaux statiques au moment de la compilation ?
Traditionnellement, les tableaux statiques en C peuvent être définis au moment de la compilation à l'aide de paramètres fixes. tableaux de taille. Toutefois, pour certains scénarios, il peut être souhaitable d’attribuer des valeurs par programmation au moment de la compilation. Cet article explore les techniques de métaprogrammation pour réaliser une telle création dynamique de tableaux statiques.
À l'aide des fonctionnalités C 0x, il est possible d'initialiser des tableaux de modèles locaux ou membres à partir d'un liste d'arguments de modèle variadique. Cette solution de contournement présente des limites en raison de la profondeur maximale d'instanciation du modèle.
Pour attribuer sélectivement des valeurs au moment de la compilation, une combinaison de modèles variadiques et de métafonctions peut être utilisée. Le modèle MetaFunc sert de pack de paramètres qui génère une séquence de valeurs basée sur son index. Un modèle generate_array peut ensuite créer un tableau de la taille souhaitée à l'aide des valeurs générées.
template<size_t index> struct MetaFunc { enum { value = index + 1 }; }; template<size_t N, template<size_t> class F> struct generate_array { typedef typename generate_array_impl<N-1, F>::result result; }; 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<unsigned... args> struct ArrayHolder { static const unsigned data[sizeof...(args)]; }; template<unsigned... args> const unsigned ArrayHolder<args...>::data[sizeof...(args)] = { args... };
void test() { const size_t count = 5; typedef generate_array<count, MetaFunc>::result A; for (size_t i = 0; i < count; ++i) std::cout << A::data[i] << "\n"; }
Cet exemple définit un modèle statique tableau de taille 5, avec les valeurs {1, 2, 3, 4, 5} attribuées au moment de la compilation à l'aide de MetaFunc métafonction.
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!