ホームページ >バックエンド開発 >C++ >C で静的メンバーを明示的に参照せずに強制的に初期化する方法は?

C で静的メンバーを明示的に参照せずに強制的に初期化する方法は?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-02 20:41:30864ブラウズ

How to Force Initialization of Static Members in C   Without Explicitly Referencing Them?

静的メンバーの強制初期化

C プログラミングでのよくある質問には、定義クラスのインスタンスを作成したり要求したりせずに静的メンバーを強制的に初期化するというものがあります。

次のコードを考えてみましょう:

<code class="cpp">template<class D>
char register_(){
    return D::get_dummy(); // static function
}

template<class D>
struct Foo{
    static char const dummy;
};

template<class D>
char const Foo<D>::dummy = register_<D>();

struct Bar
    : Foo<Bar>
{
    static char const get_dummy() { return 42; }
};</code>

この例では、具象クラス Bar のインスタンス化時にダミーが初期化されることが期待されます。ただし、標準で述べられているように、静的メンバーの初期化は、その定義が必要な方法でメンバーが使用される場合にのみ発生します。

強制的に初期化するには、いくつかの手法を使用できます。

ダミー値型の使用

<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&, a> value_user;
};

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

このアプローチでは、静的メンバー a のアドレスに依存するダミー型値を導入します。別のコンテキストで value_user を使用することで、間接的に にアクセスし、その初期化をトリガーします。

間接メンバー参照の使用

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

  user :var<int&, a>::value,
       :var<int&, 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>

この手法では、匿名メンバーを利用してアドレスにアクセスします。静的メンバーの。 var 型を介してこれらのメンバーを参照することにより、コンパイラは a と b を強制的に初期化します。

以上がC で静的メンバーを明示的に参照せずに強制的に初期化する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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