首页 > 后端开发 > C++ > 正文

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

Susan Sarandon
发布: 2024-10-28 05:04:02
原创
604 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!