Initialisierung statischer C-Mitglieder innerhalb verschachtelter Vorlagenfunktionen
Die Initialisierung statischer Mitglieder kann durch verschachtelte Hilfsstrukturen erreicht werden, insbesondere in Klassen ohne Vorlagen. Bei diesem Ansatz können jedoch Probleme auftreten, wenn die umschließende Klasse durch eine Vorlage parametrisiert wird. Insbesondere wenn im Hauptcode nicht auf das Hilfsobjekt zugegriffen wird, wird die verschachtelte Initialisierungsklasse möglicherweise nicht instanziiert.
Betrachten Sie das folgende vereinfachte Beispiel, das die Initialisierung eines Vektors veranschaulicht:
<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; } }; std::string A::mA; A::InitHelper A::mInit; template<class T> struct B { struct InitHelper { InitHelper() { B<T>::mB = "Hello, I'm B."; } }; static std::string mB; static InitHelper mInit; static const std::string& getB() { return mB; } static InitHelper& getHelper(){ return mInit; } }; template<class T> std::string B<T>::mB; template<class T> typename B<T>::InitHelper B<T>::mInit;</code>
Beim Kompilieren mit g 4.4.1 werden mehrere Beobachtungen gemacht:
Dieses Verhalten ist auf die Interpretation des ISO/IEC C 2003-Standards (14.7.1) durch den Compiler zurückzuführen. Der Standard legt Folgendes fest:
"Sofern ein Mitglied einer Klassenvorlage oder einer Mitgliedsvorlage nicht explizit instanziiert oder explizit spezialisiert wurde, wird die Spezialisierung des Mitglieds implizit instanziiert, wenn auf die Spezialisierung in a verwiesen wird Kontext, der das Vorhandensein der Elementdefinition erfordert; insbesondere findet die Initialisierung (und alle damit verbundenen Nebenwirkungen) eines statischen Datenelements nicht statt, es sei denn, das statische Datenelement selbst wird auf eine Weise verwendet, die die Definition des statischen Datenelements erfordert existieren."
Dies erklärt, warum im gegebenen Beispiel die statischen Mitglieder nicht initialisiert werden, bis auf sie über die Methoden getB() oder getHelper() zugegriffen wird. Eine explizite Instanziierung der Klassenvorlage oder Mitgliedsvorlage in der Hauptfunktion würde deren Initialisierung an diesem Punkt erzwingen. Für Szenarien, in denen ein direkter Zugriff nicht möglich ist, gibt der Standard jedoch keine elegante Problemumgehung für die Initialisierung statischer Mitglieder innerhalb verschachtelter Vorlagenfunktionen an.
Das obige ist der detaillierte Inhalt vonWie initialisiere ich statische Mitglieder in verschachtelten Vorlagenfunktionen in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!