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 ?

La métaprogrammation C peut-elle être utilisée pour créer dynamiquement des tableaux statiques au moment de la compilation ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-04 14:05:11774parcourir

Can C   Metaprogramming Be Used for Dynamically Creating Compile-Time Static Arrays?

Création par programmation de tableaux statiques au moment de la compilation en C

Introduction au problème

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.

Question 1 : attribution de valeurs par programme

À 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.

Question 2 : attribution sélective de valeurs

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.

Exemple d'implémentation

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... };

Exemple d'utilisation

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!

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