如何強制初始化靜態成員
C 中經常被忽略的行為是靜態成員不能保證自動初始化。人們可能會預期該成員是在特定類別的第一次實例化時初始化的。然而,正如標準引用所表明的那樣,只有當靜態成員被積極利用時才會發生這種情況:
「*特別是,靜態資料成員的初始化(以及任何相關的副作用)不會發生除非靜態資料成員本身的使用方式需要靜態資料成員的定義存在。直觀上,人們可能會期望在Bar 實例化時初始化dummy。然而,這種情況不會發生。
問題
如何在不需要 Bar 或 Foo 實例的情況下強制初始化 dummy?此外,此解決方案不應需要 Foo 的使用者明確引用該成員。
<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>(); // static member initialized with `register_<D>()` struct Bar : Foo<Bar> { static char const get_dummy() { return 42; } };</code>
潛在解決方案
解決方案1(對衍生類別影響最小)
對Bar 的get_dummy() 方法進行以下修改將強制初始化dummy:解決方案2(不修改派生類別)
此解決方案利用模板元程式設計:
或者,它可以在不引入任何其他成員的情況下完成:<code class="cpp">static char const get_dummy() { (void)dummy; return 42; }</code>
以上是如何在沒有明確引用的情況下強制初始化 C 中的靜態成員?的詳細內容。更多資訊請關注PHP中文網其他相關文章!