C ネストされたテンプレート関数内の静的メンバーの初期化
静的メンバーの初期化は、特に非テンプレート クラスで、ネストされたヘルパー構造体を通じて実現できます。ただし、このアプローチでは、囲んでいるクラスがテンプレートによってパラメータ化されている場合に問題が発生する可能性があります。具体的には、ヘルパー オブジェクトがメイン コードでアクセスされない場合、ネストされた初期化クラスはインスタンス化されない可能性があります。
ベクトルの初期化を示す次の簡略化された例を考えてみましょう。
<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>
g 4.4.1 でコンパイルすると、いくつかの観察が行われます:
この動作は、ISO/IEC C 2003 のコンパイラーの解釈に起因します。標準 (14.7.1)。この標準では、次のように規定されています。
「クラス テンプレートまたはメンバー テンプレートのメンバーが明示的にインスタンス化されているか、明示的に特殊化されていない限り、メンバーの特殊化は、特殊化が参照されるときに暗黙的にインスタンス化されます。特に、静的データ メンバー自体が何らかの方法で使用されない限り、静的データ メンバーの初期化 (および関連する副作用) は発生しません。これには、静的データ メンバーの定義が存在する必要があります。"
これは、指定された例で、getB() または getHelper を通じてアクセスされるまで静的メンバーが初期化されない理由を説明しています。 () メソッド。 main 関数でクラス テンプレートまたはメンバー テンプレートを明示的にインスタンス化すると、その時点でそれらの初期化が強制されます。ただし、直接アクセスが不可能なシナリオの場合、標準では、入れ子になったテンプレート関数内の静的メンバーを初期化するための優れた回避策が指定されていません。
以上がC で入れ子になったテンプレート関数の静的メンバーを初期化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。