Maison  >  Article  >  développement back-end  >  Comment initialiser des membres statiques sans instances ni classes dérivées en C ?

Comment initialiser des membres statiques sans instances ni classes dérivées en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-01 10:18:30713parcourir

How to Initialize Static Members Without Instances or Derived Classes in C  ?

Comment forcer l'initialisation d'un membre statique sans manipulation d'instance ni implication de classe dérivée

Considérez un scénario dans lequel vous souhaitez initialiser une classe statique membre lorsqu'une classe spécifique est instanciée, même sans créer d'instances ni impliquer la classe dérivée. Explorons les stratégies pour y parvenir :

Utiliser une astuce de modèle

L'introduction d'une astuce de modèle peut forcer l'initialisation d'un membre statique sans nécessiter d'instances ni modifier la classe dérivée. En créant une classe de modèle spécialisée appelée valeur, qui prend une référence entière et sa valeur comme paramètres, vous pouvez obtenir le résultat souhaité.

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

template<typename T>
struct HasStatics {
  static int a; // We enforce initialization
  typedef value<int&, a> value_user;
};

template<typename T>
int HasStatics<T>::a = /* Desired side-effect */;</code>

Exploiter l'ambiguïté syntaxique

Une autre approche consiste à exploiter l'ambiguïté de la syntaxe C. En utilisant une combinaison intelligente de typedef et d'énumération imbriquée, vous pouvez forcer l'initialisation de plusieurs membres statiques sans affecter la classe dérivée.

<code class="cpp">template<typename T, T> struct var { enum { value }; };
typedef char user;

template<typename T>
struct HasStatics {
  static int a; // We enforce initialization
  static int b; // And this one too

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

template<typename T>
int HasStatics<T>::a = /* Desired side-effect */;

template<typename T>
int HasStatics<T>::b = /* Desired side-effect */;</code>

Ces techniques fournissent des méthodes efficaces pour initialiser des membres statiques sans avoir besoin de manipulation d'instance. ou des modifications de classe dérivées.

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