Heim > Backend-Entwicklung > C++ > Hauptteil

Wie erzwinge ich die automatische Initialisierung statischer Mitglieder in C?

Susan Sarandon
Freigeben: 2024-10-28 05:04:02
Original
604 Leute haben es durchsucht

How to Force Initialization of Static Members Automatically in C  ?

So erzwingen Sie die automatische Initialisierung statischer Mitglieder

Statische Mitglieder in C werden nicht automatisch initialisiert, es sei denn, sie werden auf eine Weise verwendet, die dies erfordert Definition zu existieren. Dieses Verhalten kann manchmal unpraktisch sein, insbesondere wenn Sie während der Initialisierung statischer Elemente Nebenwirkungen ausführen möchten.

Betrachten Sie das folgende Beispiel:

<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>
Nach dem Login kopieren

In diesem Beispiel würden Sie erwarten, dass es sich um einen Dummy handelt initialisiert, sobald es eine konkrete Instanziierung von Foo gibt, die Sie mit Bar haben. Dies ist jedoch aufgrund des verzögerten Initialisierungsverhaltens statischer Elemente nicht der Fall.

Um die Initialisierung von Dummy ohne eine Instanz von Bar oder Foo zu erzwingen, können Sie eine der folgenden Techniken verwenden:

  • Verwenden Sie eine Vorlagenspezialisierung für die abgeleitete Klasse: Bei dieser Technik wird eine Spezialisierung der Vorlagenklasse für die abgeleitete Klasse erstellt und das statische Mitglied in dieser Spezialisierung manuell initialisiert.
<code class="cpp">template<class D>
struct Bar
    : Foo<Bar>
{
    static char const get_dummy() { return (void)dummy; return 42; }
};</code>
Nach dem Login kopieren
  • Verwenden Sie eine Vorlagenstruktur, um die Initialisierung zu erzwingen: Bei dieser Technik wird eine Vorlagenstruktur erstellt, die die Initialisierung des statischen Mitglieds durch eine Mitgliedsvariable der Vorlagenstruktur erzwingt.
<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>
Nach dem Login kopieren
  • Verwenden Sie eine Template-Struktur mit einer anonymen Enum-Union: Diese Technik ähnelt der vorherigen, verwendet jedoch eine anonyme Union, um die Initialisierung der Statik zu erzwingen Mitglieder.
<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>
Nach dem Login kopieren

Mit diesen Techniken können Sie die Initialisierung statischer Mitglieder erzwingen, ohne dass ein Benutzereingriff oder eine Änderung der abgeleiteten Klasse erforderlich ist. Die zu verwendende spezifische Technik hängt von Ihren spezifischen Anforderungen und Vorlieben für den Codierungsstil ab.

Das obige ist der detaillierte Inhalt vonWie erzwinge ich die automatische Initialisierung statischer Mitglieder in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!