C で静的メンバーの初期化を自動的に強制する方法

Susan Sarandon
リリース: 2024-10-28 05:04:02
オリジナル
604 人が閲覧しました

How to Force Initialization of Static Members Automatically in C  ?

静的メンバーを自動的に強制的に初期化する方法

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 で持つ Foo の具体的なインスタンス化があるとすぐに初期化されます。ただし、静的メンバーの遅延初期化動作により、これは当てはまりません。

Bar または Foo のインスタンスを使用せずにダミーの初期化を強制するには、次のいずれかの手法を使用できます。

  • 派生クラスにテンプレートの特殊化を使用する: この手法には、派生クラスのテンプレート クラスの特殊化を作成し、その特殊化の静的メンバーを手動で初期化することが含まれます。
<code class="cpp">template<class D>
struct Bar
    : Foo<Bar>
{
    static char const get_dummy() { return (void)dummy; return 42; }
};</code>
ログイン後にコピー
  • テンプレート構造体を使用して初期化を強制する: この手法には、テンプレート構造体のメンバー変数を通じて静的メンバーの初期化を強制するテンプレート構造体の作成が含まれます。
<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>
ログイン後にコピー
  • 列挙型匿名ユニオンを使用したテンプレート構造体の使用: この手法は前の手法と似ていますが、匿名ユニオンを使用して静的オブジェクトの初期化を強制します。 members.
<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&, 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>
ログイン後にコピー

これらの手法を使用すると、ユーザーの介入や派生クラスの変更を必要とせずに、静的メンバーを強制的に初期化できます。使用する具体的な手法は、特定の要件とコーディング スタイルの好みによって異なります。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!