2014-07-13 1 views
4

Я пытаюсь использовать 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 не является проблемой.

+2

[temp.inst]/2 о * неявной * конкретизация: «Если член шаблона класса или шаблон члена не был явно инстанциирован явно специализирован, специализация члена неявно создается, когда специализация ссылается в контексте, который требует определения члена; ** в частности, инициализация (и любые связанные с ней побочные эффекты) статического члена данных не происходит, если только элемент статических данных само по себе используется таким образом, чтобы требовалось определение элемента статических данных **. " – dyp

+0

Вы можете попробовать использовать od init-init 'в виртуальной функции-члена шаблона базового класса. – dyp

+0

"любой класс, который должен выполнять работу в' InitHelper '..." Ну, 'InitHelper' не является шаблоном в этом дизайне, поэтому я понятия не имею, что это значит. – WhozCraig

ответ

8

Вы можете передать переменную в качестве опорного аргумента шаблона. Тогда объект нужен, который вызывает инстанцирование

template <typename T, T /*unnamed*/> 
struct NonTypeParameter { }; 

template <typename T> 
class InitCRTP 
{ 
public: 
    static InitHelper init; 
    typedef NonTypeParameter<InitHelper&, init> object_user_dummy; 
}; 

 Смежные вопросы

  • Нет связанных вопросов^_^