首页  >  文章  >  后端开发  >  如何在 C 中自动强制初始化静态成员?

如何在 C 中自动强制初始化静态成员?

Susan Sarandon
Susan Sarandon原创
2024-10-28 05:04:02605浏览

How to Force Initialization of Static Members Automatically in C  ?

如何强制自动初始化静态成员

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn