In C können statische Member mithilfe verschachtelter Hilfsstrukturen initialisiert werden. Während dieser Ansatz für Klassen ohne Vorlagen gut funktioniert, kann er in Klassen mit Vorlagenparametern zu Herausforderungen führen.
Betrachten Sie das folgende Beispiel, in dem ein statischer Member-Initialisierungshelfer in a verwendet wird Vorlageklasse:
<code class="cpp">struct A { struct InitHelper { InitHelper() { A::mA = "Hello, I'm A."; } }; static std::string mA; static InitHelper mInit; static const std::string& getA() { return mA; } }; template<class T> struct B { struct InitHelper { InitHelper() { B<T>::mB = "Hello, I'm B."; } // [3] }; static std::string mB; static InitHelper mInit; // [4] static const std::string& getB() { return mB; } static InitHelper& getHelper() { return mInit; } };</code>
In diesem Szenario werden die folgenden Beobachtungen gemacht:
Das unerwartete Verhalten ist auf das Verhalten der statischen Elementinitialisierung in zurückzuführen Klassen mit Vorlagen. Gemäß dem ISO/IEC C 2003-Standard (14.7.1) erfolgt die Initialisierung eines statischen Datenelements nur, wenn das statische Datenelement selbst auf eine Weise verwendet wird, die das Vorhandensein seiner Definition erfordert.
An Vermeiden Sie die Abhängigkeit von der impliziten Initialisierung und stellen Sie eine konsistente Initialisierungsreihenfolge sicher. Es wird empfohlen, das statische Datenelement explizit in der Klassenvorlage zu spezialisieren. In diesem Fall:
<code class="cpp">template<> std::string B<int>::mB = "Hello, I'm B (int specialization).";</code>
Durch die explizite Spezialisierung des statischen Datenelements für jede Instanziierung der Vorlagenklasse wird die Initialisierung explizit ausgelöst und das gewünschte Verhalten erreicht, ohne dass auf den Initialisierungshelfer zurückgegriffen werden muss.
Das obige ist der detaillierte Inhalt vonWie können Sie statische Mitglieder in C-Klassen mit Vorlagen mithilfe verschachtelter Hilfsstrukturen zuverlässig initialisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!