"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > La métaprogrammation C ++ peut-elle être utilisée pour créer dynamiquement des réseaux statiques à temps de compilation?

La métaprogrammation C ++ peut-elle être utilisée pour créer dynamiquement des réseaux statiques à temps de compilation?

Publié le 2025-02-06
Parcourir:890

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

Création programmatique de table tableaux de taille. Cependant, pour certains scénarios, il peut être souhaitable d'attribuer des valeurs par programme 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

en utilisant des fonctionnalités C 0x, il est possible d'initialiser les tableaux locaux ou membres de modèles à partir d'un modèle à partir d'un modèle à partir d'un Liste d'arguments de modèle variadique. Cette solution de contournement a des limitations dues à la profondeur d'instanciation du modèle maximum.

Question 2: Affectation de valeur sélective

Pour attribuer sélectivement des valeurs au moment de la compilation, une combinaison de modèles variadiques et de métafonctions peut être utilisé. Le modèle Metafunc sert de pack de paramètres qui génère une séquence de valeurs en fonction de son index. Un modèle Generate_Array peut alors créer un tableau de la taille souhaitée à l'aide des valeurs générées.

Exemple d'implémentation

template struct metafunc {enum {value = index 1}; }; Template classe f & gt; struct generate_array { typedef typename generate_array_impl :: résultat résultat; }; modèle classe F, unsigned ... args & gt; struct generate_array_impl { typedef typename generate_array_impl :: Value, args ...> :: Résultat résultat; }; Template classe F, unsigned ... args & gt; struct generate_array_impl :: Valeur, Args ... & gt; résultat; }; modèle & lt; unsigned ... args & gt; Struct Arrayholder { Données statiques constantes non signées [sizeof ... (args)]; }; modèle & lt; unsigned ... args & gt; Const unsigned Arrayholder & lt; args ... & gt; :: data [sizeof ... (args)] = {args ...};

Exemple d'utilisation

template struct MetaFunc { enum { value = index   1 }; };

template class F> 
struct generate_array {
    typedef typename generate_array_impl::result result;
};

template class F, unsigned... args> 
struct generate_array_impl {
    typedef typename generate_array_impl::value, args...>::result result;
};

template

Cet exemple définit un tableau statique de taille 5, avec des valeurs {1, 2, 3, 4, 5} attribuées au moment de la compilation en utilisant la métafonction métafunc.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3