Рассмотрим пример кода:
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; }
};
Хотя я все еще хотел бы, чтобы производный класс не делал этого.: |