Heim > Backend-Entwicklung > C++ > Wie erzwinge ich die Initialisierung eines statischen Members in C ohne explizite Referenzierung?

Wie erzwinge ich die Initialisierung eines statischen Members in C ohne explizite Referenzierung?

DDD
Freigeben: 2024-10-31 05:38:01
Original
397 Leute haben es durchsucht

 How to Force Initialization of a Static Member in C   Without Explicit Referencing?

So erzwingen Sie die Initialisierung eines statischen Mitglieds

Ein häufig übersehenes Verhalten in C ist, dass statische Mitglieder nicht garantiert automatisch initialisiert werden. Man kann davon ausgehen, dass das Mitglied mit der ersten Instanziierung der konkreten Klasse initialisiert wird. Wie aus dem Zitat aus dem Standard hervorgeht, geschieht dies jedoch nur, wenn das statische Element aktiv genutzt wird:

"* Insbesondere findet die Initialisierung (und alle damit verbundenen Nebenwirkungen) eines statischen Datenelements nicht statt es sei denn, das statische Datenelement wird selbst in einer Weise verwendet, die die Existenz der Definition des statischen Datenelements erfordert 🎜>

Intuitiv könnte man erwarten, dass Dummy bei der Instanziierung von Bar initialisiert wird. Dies geschieht jedoch nicht.

Die Frage

<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>(); // static member initialized with `register_<D>()`

struct Bar : Foo<Bar> {
  static char const get_dummy() { return 42; }
};</code>
Nach dem Login kopieren
Wie kann man die Initialisierung von Dummy erzwingen, ohne dass eine Instanz von Bar oder Foo erforderlich ist? Darüber hinaus sollte die Lösung keine explizite Referenzierung des Mitglieds durch den Benutzer von Foo erfordern.

Potenzielle Lösungen

Lösung 1 (Minimale Auswirkung auf die abgeleitete Klasse)

Die folgende Änderung an der get_dummy()-Methode von Bar erzwingt die Initialisierung von Dummy:

Lösung 2 (Keine Änderung an der abgeleiteten Klasse)

Diese Lösung nutzt Template-Metaprogrammierung:

<code class="cpp">static char const get_dummy() { (void)dummy; return 42; }</code>
Nach dem Login kopieren

Oder es kann ohne Einführung zusätzlicher Mitglieder erfolgen:

Das obige ist der detaillierte Inhalt vonWie erzwinge ich die Initialisierung eines statischen Members in C ohne explizite Referenzierung?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage