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

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

Barbara Streisand
リリース: 2024-11-01 16:47:02
オリジナル
908 人が閲覧しました

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

  • [1] と [2] がコメントアウトされているため、A = こんにちは、A です。 これは
  • [1] のコメントを解除すると、A = こんにちは、A です。B = これは、B::mB の初期化がトリガーされないことを示します。
  • [1] と [2] の両方のコメントを解除すると、A = Hello, I'm A. B = Hello, I'm B. これにより、B へのアクセスが確認されます。 :mInit ([2] を通じて) は B::mB の初期化を開始します。
  • [1] がコメント化され、[2] がコメント化されていないと、セグフォルト が発生します。これは、ヘルパー自体では、B::mB の初期化が途中で試行され、エラーが発生します。

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

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

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

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート