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

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

Mary-Kate Olsen
發布: 2024-11-02 20:41:30
原創
898 人瀏覽過

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 時初始化 dummy。但是,如標準所述,靜態成員初始化僅在需要定義成員的方式使用時才會發生。

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

使用虛擬值類型

<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,我們間接存取 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;</code>
登入後複製

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

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板