考虑这个示例代码:
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_
)没有任何实例Bar
或Foo
(没有实例,所以没有构造函数欺骗),没有用户Foo
需要以某种方式明确说明成员?额外的cookie,不需要派生类做任何事情.
编辑:找到一种方法,对派生类的影响最小:
struct Bar
: Foo<Bar>
{ // vvvvvvvvvvvv
static …
Run Code Online (Sandbox Code Playgroud)