如何强制自动初始化静态成员
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>
在此示例中,您希望 dummy 为一旦有 Foo 的具体实例化(Bar 就有了),它就会被初始化。然而,由于静态成员的延迟初始化行为,情况并非如此。
要在没有任何 Bar 或 Foo 实例的情况下强制初始化虚拟,您可以使用以下技术之一:
<code class="cpp">template<class D> struct Bar : Foo<Bar> { static char const get_dummy() { return (void)dummy; return 42; } };</code>
<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>
<code class="cpp">template<typename T, T> struct var { enum { value }; }; typedef char user; template<typename T> struct HasStatics { static int a; // we force this to be initialized static int b; // and this // hope you like the syntax! 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>
这些技术允许您强制初始化静态成员,而不需要用户干预或修改派生类。使用的具体技术将取决于您的具体要求和编码风格偏好。
以上是如何在 C 中自动强制初始化静态成员?的详细内容。更多信息请关注PHP中文网其他相关文章!