首页 > 后端开发 > C++ > 如何在 C 中强制初始化静态成员而不显式引用它们?

如何在 C 中强制初始化静态成员而不显式引用它们?

Mary-Kate Olsen
发布: 2024-11-02 20:41:30
原创
857 人浏览过

How to Force Initialization of Static Members in C   Without Explicitly Referencing Them?

强制静态成员初始化

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板