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>
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>
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>
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!