Création programmatique de tableaux statiques au moment de la compilation en C
La création de tableaux statiques au moment de la compilation en C est une technique précieuse pour optimiser les performances et garantir l’intégrité des données. Une façon de définir un tableau statique consiste à utiliser la syntaxe suivante :
const std::size_t size = 5; unsigned int list[size] = { 1, 2, 3, 4, 5 };
Bien que cette approche soit simple, elle nécessite de spécifier explicitement les valeurs du tableau. Pour gagner plus de flexibilité, il peut être souhaitable d'attribuer ces valeurs « par programmation » au moment de la compilation en utilisant diverses techniques de métaprogrammation.
Question 1 : Assignation de valeur programmatique
Pouvons-nous utiliser des techniques de métaprogrammation pour attribuer des valeurs de tableau "par programme" lors de la compilation time?
Réponse :
Oui, en utilisant les fonctionnalités C 0x, nous pouvons initialiser des tableaux de modèles locaux ou membres à partir d'une liste d'arguments de modèle variadique. Bien que cette approche puisse être limitée par la profondeur d'instanciation du modèle, elle peut apporter une amélioration significative de la flexibilité.
Question 2 : affectation sélective de valeurs
En supposant que toutes les valeurs de un tableau est le même à l'exception de quelques-uns, pouvons-nous attribuer sélectivement des valeurs au moment de la compilation dans un programme manière ?
Réponse :
Oui, nous pouvons utiliser une combinaison de modèles variadiques et de modèles de fonctions pour générer des tableaux avec des valeurs spécifiques. Par exemple, considérons le code suivant :
template<unsigned... args> struct ArrayHolder { static const unsigned data[sizeof...(args)]; }; template<unsigned... args> const unsigned ArrayHolder<args...>::data[sizeof...(args)] = { args... }; 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; };
Ce code nous permet de créer des tableaux avec des valeurs spécifiques en spécifiant une fonction de modèle qui détermine la valeur à chaque index.
Exemple :
Pour créer un tableau de taille 5 avec des valeurs de 1 à 5 :
template<size_t index> struct MetaFunc { enum { value = index + 1 }; }; 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"; }
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!