ホームページ  >  記事  >  バックエンド開発  >  ネストされたヘルパー構造体を使用して、テンプレート化された C クラスの静的メンバーを確実に初期化するにはどうすればよいでしょうか?

ネストされたヘルパー構造体を使用して、テンプレート化された C クラスの静的メンバーを確実に初期化するにはどうすればよいでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-30 05:43:02953ブラウズ

 How can you reliably initialize static members in templated C   classes using nested helper structs?

テンプレート化されたクラスと初期化ヘルパーでの静的メンバーの初期化

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>

このシナリオでは、次のことが観察されます:

  • [1] と [2] がコメントアウトされているため、出力は期待どおりになります。 = Hello, I'm A.".
  • [1] のコメントを解除すると、出力は予期される "Hello, I'm B." ではなく "A = Hello, I'm A.nB = " になります。 ".
  • [1] と [2] の両方のコメントを解除すると、出力は期待どおりになります: "A = Hello, I'm A.nB = Hello, I'm B.".
  • [1] をコメントアウトし、[2] をコメント解除すると、プログラムは [3] でセグメンテーション違反になります。

説明

予期しない動作は、静的メンバーの初期化の動作に起因します。テンプレート化されたクラス。 ISO/IEC C 2003 標準 (14.7.1) によれば、静的データ メンバーの初期化は、その定義が存在する必要がある方法で静的データ メンバー自体が使用される場合にのみ発生します。

  • A の場合、静的データ メンバー mA は main で明示的に参照されるため、main 関数が実行される前にその初期化が行われます。
  • B の場合、B::getB() にアクセスします。 B::mB を参照し、その初期化をトリガーします。ただし、B::getHelper() へのアクセスは B::mInit を直接使用せず、初期化ヘルパーにエイリアスを返すだけです。

Solution

To暗黙的な初期化への依存を避け、一貫した初期化順序を確保するには、クラス テンプレートで静的データ メンバーを明示的に特殊化することをお勧めします。この場合:

<code class="cpp">template<>
std::string B<int>::mB = "Hello, I'm B (int specialization).";</code>

テンプレート化されたクラスのインスタンス化ごとに静的データ メンバーを明示的に特殊化することで、初期化が明示的にトリガーされ、初期化ヘルパーにアクセスすることなく、目的の動作が実現されます。

以上がネストされたヘルパー構造体を使用して、テンプレート化された C クラスの静的メンバーを確実に初期化するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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