首頁 >後端開發 >C++ >如何在 C 中強制初始化靜態成員而不明確引用它們?

如何在 C 中強制初始化靜態成員而不明確引用它們?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-02 20:41:30946瀏覽

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; }
};</bar></d></d></class></class></class></code>

在此範例中,我們預期在實例化特定類別 Bar 時初始化 dummy。但是,如標準所述,靜態成員初始化僅在需要定義成員的方式使用時才會發生。

要強制初始化,可以採用多種技術:

使用虛擬值類型

<code class="cpp">template<typename 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;</t></typename></int></typename></typename></code>

此方法引入了依賴靜態成員a地址的虛擬類型值。透過在另一個上下文中使用 value_user,我們間接存取 a 並觸發其初始化。

使用間接成員引用

<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;</t></typename></t></typename></int></int></typename></code>

此技術利用匿名成員來存取位址靜態成員。透過 var 類型引用這些成員,編譯器被迫初始化 a 和 b。

以上是如何在 C 中強制初始化靜態成員而不明確引用它們?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn