ホームページ  >  記事  >  バックエンド開発  >  C で入れ子になったテンプレート関数の静的メンバーを初期化する方法

C で入れ子になったテンプレート関数の静的メンバーを初期化する方法

Barbara Streisand
Barbara Streisandオリジナル
2024-11-01 16:47:02801ブラウズ

 How to Initialize Static Members in Nested Template Functions in C  ?

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 でコンパイルすると、いくつかの観察が行われます:

  • With [1] [2] はコメントアウトされています。A = こんにちは、A です。 これは、初期化が意図したとおりに機能することを示します。
  • [1] のコメントが解除されている場合、A = こんにちは。私は A です。 B = これは、B::mB の初期化が自動的にトリガーされないことを示しています。
  • 両方とも[1] と [2] はコメントされていません。A = Hello, I'm A. B = Hello, I'm B. これにより、([2] を介した) B::mInit へのアクセスによって、 B::mB の初期化。
  • [1] がコメント化され、[2] がコメント化されていない場合、セグメンテーション違反これは、ヘルパー自体に直接アクセスすることによって、B::mB の初期化が途中で試行され、エラーが発生することを示します。

この動作は、ISO/IEC C 2003 のコンパイラーの解釈に起因します。標準 (14.7.1)。この標準では、次のように規定されています。

「クラス テンプレートまたはメンバー テンプレートのメンバーが明示的にインスタンス化されているか、明示的に特殊化されていない限り、メンバーの特殊化は、特殊化が参照されるときに暗黙的にインスタンス化されます。特に、静的データ メンバー自体が何らかの方法で使用されない限り、静的データ メンバーの初期化 (および関連する副作用) は発生しません。これには、静的データ メンバーの定義が存在する必要があります。"

これは、指定された例で、getB() または getHelper を通じてアクセスされるまで静的メンバーが初期化されない理由を説明しています。 () メソッド。 main 関数でクラス テンプレートまたはメンバー テンプレートを明示的にインスタンス化すると、その時点でそれらの初期化が強制されます。ただし、直接アクセスが不可能なシナリオの場合、標準では、入れ子になったテンプレート関数内の静的メンバーを初期化するための優れた回避策が指定されていません。

以上がC で入れ子になったテンプレート関数の静的メンバーを初期化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。