相关疑难解决方法(0)

如何强制静态成员初始化?

考虑这个示例代码:

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; }
};
Run Code Online (Sandbox Code Playgroud)

(也在Ideone上.)

我期望dummy得到尽快初始化为有一个具体的实例Foo,我有Bar.这个问题(以及最后的标准引用)解释得很清楚,为什么没有发生.

[...]特别是,除非静态数据成员本身以需要静态数据成员的定义存在的方式使用,否则不会发生静态数据成员的初始化(以及任何相关的副作用).

有没有办法强制 dummy初始化(有效调用register_)没有任何实例BarFoo(没有实例,所以没有构造函数欺骗),没有用户Foo需要以某种方式明确说明成员?额外的cookie,不需要派生类做任何事情.


编辑:找到一种方法,对派生类的影响最小:

struct Bar
    : Foo<Bar>
{   //                              vvvvvvvvvvvv
    static …
Run Code Online (Sandbox Code Playgroud)

c++ templates static-members static-initialization

20
推荐指数
2
解决办法
3847
查看次数