Heim > Artikel > Backend-Entwicklung > Wie erzwinge ich die Initialisierung statischer Member in C, ohne sie explizit zu referenzieren?
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>
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>
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>
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!