考虑这个示例代码:
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; }
};
(也在 Ideone 上。)
我希望dummy
一旦有 的具体实例化就可以初始化Foo
,我有Bar
. 这个问题(以及最后的标准报价)解释得很清楚,为什么没有发生。
[...] 特别是,静态数据成员的初始化(以及任何相关的副作用)不会发生,除非静态数据成员本身的使用方式要求静态数据成员的定义存在。
有没有什么方法可以强制 dummy
初始化(有效地调用register_
)而没有任何实例Bar
或Foo
(没有实例,所以没有构造函数诡计)并且用户Foo
不需要以某种方式显式声明成员?不需要派生类做任何事情的额外 cookie。
编辑:找到一种对派生类影响最小的方法:
struct Bar
: Foo<Bar>
{ // vvvvvvvvvvvv
static char const get_dummy() { (void)dummy; return 42; }
};
不过,我仍然希望派生类不必这样做。:|