強制靜態成員初始化
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中文網其他相關文章!