ホームページ  >  記事  >  バックエンド開発  >  インスタンス化せずにテンプレート クラスの静的メンバーを強制的に初期化できますか?

インスタンス化せずにテンプレート クラスの静的メンバーを強制的に初期化できますか?

DDD
DDDオリジナル
2024-11-01 15:37:30164ブラウズ

Can You Force Initialization of Static Members in Template Classes Without Instantiation?

静的メンバーを明示的に初期化する方法

質問:

C では、静的メンバーはテンプレート クラスは、具体的なインスタンス化内で明示的に使用される場合にのみ初期化されます。インスタンスを作成したり、ユーザーにメンバーを直接指定させたりせずに、強制的に初期化する方法はありますか?

回答:

はい、強制的に初期化することができます。次のいずれかの手法を使用して静的メンバーを初期化します:

ラッパー型の使用:

<code class="cpp">template<typename T, T> struct value { };

template<typename T>
struct HasStatics {
  static int a; // we force this to be initialized
  typedef value<int&amp;, a> value_user;
};

template<typename T>
int HasStatics<T>::a = /* whatever side-effect you want */ 0;</code>

構文トリックの使用:

<code class="cpp">template<typename T, T> struct var { enum { value }; };
typedef char user;

template<typename T>
struct HasStatics {
  static int a; // we force this to be initialized
  static int b; // and this

  // hope you like the syntax!
  user :var<int&amp;, a>::value,
       :var<int&amp;, b>::value;
};

template<typename T>
int HasStatics<T>::a = /* whatever side-effect you want */ 0;

template<typename T>
int HasStatics<T>::b = /* whatever side-effect you want */ 0;</code>

どちらの手法も、メンバーの定義の評価をトリガーする依存関係を導入することで、静的メンバーの初期化を強制します。 2 番目の手法には型破りな構文が含まれるため、すべてのケースに適しているわけではないことに注意してください。

以上がインスタンス化せずにテンプレート クラスの静的メンバーを強制的に初期化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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