Я пытаюсь использовать CRTPed базу для проведения какой-то статический код инициализации, как это:Force Явный шаблон конкретизации с CRTP
template <typename T>
class InitCRTP
{
public:
static InitHelper<T> init;
};
template <typename T> InitHelper<T> InitCRTP<T>::init;
Теперь, любой класс, который должен сделать работу в InitHelper<T>
может сделать это:
class WantInit : public InitCRTP<WantInit>
{
public:
void dummy(){init;}//To force instantiation of init
};
template class InitCRTP<WantInit>;//Forcing instantiation of init through explicit instantiation of `InitCRTP<WantInit>`.
Чтобы заставить экземпляр InitCRTP<WantInit>::init
, можно либо использовать dummy
или использовать явное создание экземпляра, как показано выше. Есть ли способ обойти это, не делая ни того, ни другого? Я хотел бы, чтобы пользователи этого шаблона могли просто наследовать от InitCRTP<WantInit>
и не беспокоиться ни о чем другом. Если это помогает, использование C++11
не является проблемой.
[temp.inst]/2 о * неявной * конкретизация: «Если член шаблона класса или шаблон члена не был явно инстанциирован явно специализирован, специализация члена неявно создается, когда специализация ссылается в контексте, который требует определения члена; ** в частности, инициализация (и любые связанные с ней побочные эффекты) статического члена данных не происходит, если только элемент статических данных само по себе используется таким образом, чтобы требовалось определение элемента статических данных **. " – dyp
Вы можете попробовать использовать od init-init 'в виртуальной функции-члена шаблона базового класса. – dyp
"любой класс, который должен выполнять работу в' InitHelper '..." Ну, 'InitHelper' не является шаблоном в этом дизайне, поэтому я понятия не имею, что это значит. –
WhozCraig