强制静态成员初始化
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中文网其他相关文章!