Maison > développement back-end > C++ > Comment forcer l'initialisation des membres statiques en C sans les référencer explicitement ?

Comment forcer l'initialisation des membres statiques en C sans les référencer explicitement ?

Mary-Kate Olsen
Libérer: 2024-11-02 20:41:30
original
877 Les gens l'ont consulté

How to Force Initialization of Static Members in C   Without Explicitly Referencing Them?

Initialisation forcée des membres statiques

Une question courante en programmation C consiste à forcer l'initialisation des membres statiques sans créer d'instances de la classe de définition ni exiger l'utilisateur doit référencer explicitement le membre.

Considérez le code suivant :

<code class="cpp">template<class D>
char register_(){
    return D::get_dummy(); // static function
}

template<class D>
struct Foo{
    static char const dummy;
};

template<class D>
char const Foo<D>::dummy = register_<D>();

struct Bar
    : Foo<Bar>
{
    static char const get_dummy() { return 42; }
};</code>
Copier après la connexion

Dans cet exemple, nous nous attendons à ce que dummy soit initialisé lors de l'instanciation de la classe concrète Bar. Cependant, comme l'indique la norme, l'initialisation statique d'un membre ne se produit que lorsque le membre est utilisé d'une manière qui nécessite sa définition.

Pour forcer l'initialisation, plusieurs techniques peuvent être utilisées :

Utilisation d'un type de valeur factice

<code class="cpp">template<typename T, T> struct value { };

template<typename T>
struct HasStatics {
  static int a; // we force this to be initialized
  typedef value<int&, a> value_user;
};

template<typename T>
int HasStatics<T>::a = /* whatever side-effect you want */ 0;</code>
Copier après la connexion

Cette approche introduit une valeur de type factice qui repose sur l'adresse du membre statique a. En utilisant value_user dans un autre contexte, nous accédons indirectement à a et déclenchons son initialisation.

Utilisation de références de membres indirectes

<code class="cpp">template<typename T>
struct HasStatics {
  static int a; // we force this to be initialized
  static int b; // and this

  user :var<int&, a>::value,
       :var<int&, b>::value;
};

template<typename T>
int HasStatics<T>::a = /* whatever side-effect you want */ 0;

template<typename T>
int HasStatics<T>::b = /* whatever side-effect you want */ 0;</code>
Copier après la connexion

Cette technique utilise des membres anonymes pour accéder aux adresses de membres statiques. En référençant ces membres via le type var, le compilateur est obligé d'initialiser a et b.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal