Comment initialiser explicitement des membres statiques
Question :
En C, les membres statiques de une classe de modèle n'est initialisée que lorsqu'elle est explicitement utilisée dans une instanciation concrète. Existe-t-il un moyen de forcer leur initialisation sans créer d'instance ni demander à l'utilisateur de spécifier directement le membre ?
Réponse :
Oui, il est possible de forcer l'initialisation initialisation d'un membre statique en employant l'une des techniques suivantes :
Utilisation d'un type Wrapper :
<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>
Utilisation d'une astuce syntaxique :
<code class="cpp">template<typename T, T> struct var { enum { value }; }; typedef char user; template<typename T> struct HasStatics { static int a; // we force this to be initialized static int b; // and this // hope you like the syntax! 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>
Les deux techniques forcent l'initialisation des membres statiques en introduisant une dépendance qui déclenche l'évaluation de la définition du membre. Notez que la deuxième technique implique une syntaxe non conventionnelle et peut ne pas convenir à tous les cas.
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!