Heim > Backend-Entwicklung > C++ > Wie erzwinge ich die Initialisierung statischer Member in C, ohne sie explizit zu referenzieren?

Wie erzwinge ich die Initialisierung statischer Member in C, ohne sie explizit zu referenzieren?

Mary-Kate Olsen
Freigeben: 2024-11-02 20:41:30
Original
876 Leute haben es durchsucht

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

Erzwungene Initialisierung statischer Member

Eine häufige Frage bei der C-Programmierung besteht darin, die Initialisierung statischer Member zu erzwingen, ohne Instanzen der definierenden Klasse zu erstellen oder zu erfordern der Benutzer muss explizit auf das Mitglied verweisen.

Betrachten Sie den folgenden Code:

<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 erwarten wir, dass Dummy bei der Instanziierung der konkreten Klasse Bar initialisiert wird. Wie im Standard angegeben, erfolgt die Initialisierung eines statischen Mitglieds jedoch nur, wenn das Mitglied auf eine Weise verwendet wird, die seine Definition erfordert.

Um die Initialisierung zu erzwingen, können verschiedene Techniken eingesetzt werden:

Verwendung eines Dummy-Werttyps

<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

Dieser Ansatz führt einen Dummy-Werttyp ein, der auf der Adresse des statischen Mitglieds a basiert. Durch die Verwendung von value_user in einem anderen Kontext greifen wir indirekt auf a zu und lösen dessen Initialisierung aus.

Verwendung indirekter Mitgliedsreferenzen

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

Diese Technik nutzt anonyme Mitglieder, um auf die Adressen zuzugreifen von statischen Elementen. Durch die Referenzierung dieser Mitglieder über den var-Typ wird der Compiler gezwungen, a und b zu initialisieren.

Das obige ist der detaillierte Inhalt vonWie erzwinge ich die Initialisierung statischer Member in C, ohne sie explizit zu referenzieren?. 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