Maison >développement back-end >C++ >Les tableaux statiques en C peuvent-ils être initialisés par programme au moment de la compilation ?

Les tableaux statiques en C peuvent-ils être initialisés par programme au moment de la compilation ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-19 21:09:02639parcourir

Can Static Arrays in C   Be Programmatically Initialized at Compile Time?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn