このサンプルコードを考えてみましょう。
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
ます。この質問(および最後の標準引用)は、なぜそれが起こらないのかをかなり明確に説明しました。
[...]特に、静的データメンバーの定義が存在する必要がある方法で静的データメンバー自体が使用されない限り、静的データメンバーの初期化(および関連する副作用)は発生しません。
または(インスタンスがないため、コンストラクターのトリックがない)を使用せずに、またユーザーが何らかの方法でメンバーを明示的に指定する必要なしに、強制 dummy
的に初期化(効果的に呼び出すregister_
)する方法はありますか?派生クラスが何もする必要がないための追加のCookie。Bar
Foo
Foo
編集:派生クラスへの影響を最小限に抑える方法を見つけました:
struct Bar
: Foo<Bar>
{ // vvvvvvvvvvvv
static char const get_dummy() { (void)dummy; return 42; }
};
ただし、派生クラスにはそれを行わなくてもよいのですが。:|