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; } }; 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>
このシナリオでは、次のことが観察されます:
予期しない動作は、静的メンバーの初期化の動作に起因します。テンプレート化されたクラス。 ISO/IEC C 2003 標準 (14.7.1) によれば、静的データ メンバーの初期化は、その定義が存在する必要がある方法で静的データ メンバー自体が使用される場合にのみ発生します。
To暗黙的な初期化への依存を避け、一貫した初期化順序を確保するには、クラス テンプレートで静的データ メンバーを明示的に特殊化することをお勧めします。この場合:
<code class="cpp">template<> std::string B<int>::mB = "Hello, I'm B (int specialization).";</code>
テンプレート化されたクラスのインスタンス化ごとに静的データ メンバーを明示的に特殊化することで、初期化が明示的にトリガーされ、初期化ヘルパーにアクセスすることなく、目的の動作が実現されます。
以上がネストされたヘルパー構造体を使用して、テンプレート化された C クラスの静的メンバーを確実に初期化するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。