2014-07-13 141 views
4

我試圖用一個CRTPed基地舉辦一些靜態初始化代碼:力顯式模板實例化與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

您可以在基類模板的虛擬成員函數中嘗試odr-using'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; 
};