Рассмотрим пример кода:
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_
) без какого-либо экземпляра Bar
или Foo
(без экземпляров, поэтому без хитрости конструктора) и без необходимости явно указывать пользователю Foo
указать член каким-то образом? Дополнительные файлы cookie для того, чтобы не нуждаться в производном классе для выполнения каких-либо действий.
Изменить: Нашел способ с минимальным воздействием на производный класс:
struct Bar
: Foo<Bar>
{ // vvvvvvvvvvvv
static char const get_dummy() { (void)dummy; return 42; }
};
Хотя я все еще хотел бы, чтобы производный класс не делал этого.: |