考虑这个例子的代码:(Also on Ideone)如何强制一个静态成员被初始化?
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; }
};
我期望dummy
,因为是Foo
一个具体的实例,我有Bar
得到尽快初始化。 This question(和最后的标准报价)解释得很清楚,为什么没有发生。
尤其是,静态数据成员的初始化(以及任何相关的副作用)不会发生,除非静态数据成员本身以需要定义静态数据成员存在。
有什么办法来力dummy
进行初始化(有效调用register_
)没有的Bar
或Foo
任何情况下(没有实例,所以没有构造欺骗)和无Foo
需要用户明确以某种方式陈述会员?额外的饼干不需要派生类来做任何事情。
编辑:Found a way对派生类的影响最小:
struct Bar
: Foo<Bar>
{ // vvvvvvvvvvvv
static char const get_dummy() { (void)dummy; return 42; }
};
不过,我还是想在派生类没有做到这一点。 :|
我们一般不希望编译器初始化所有类模板所有未使用的变量。在这种情况下,编译器应该如何知道**你想要它?通过实际使用它? –
@Bo:当然,但我想隐藏派生类/外部世界的用法,并且宁愿以某种方式将其用于'Foo'本身。 :/ – Xeo
@Xeo:'static char const get_dummy(){(void)dummy;返回42; }' - 我怀疑'Bar :: get_dummy()'和'Foo :: dummy'之间的这个循环依赖关系可以保证工作(通过标准)。看起来像高度依赖实施的技巧。我错了吗? –