2017-04-04 170 views
1

this question它說,它是不可能的,只是直接使用模板參數類的構造函數,因爲如果你喜歡寫東西構造與非類型模板參數

struct S{ 
    template<typename T> 
    S() { ... } 
} 

那麼你有沒有調用此構造方法。但是,有一些解決方法可以使此工作,例如,通過模板參數推演。

但我知道的所有這些變通辦法只適用於類型參數。所以,問題是

是否有任何變通辦法使這種工作的非類型模板參數?

struct S{ 
    template<int x> 
    S() { ... } 
} 

我感興趣的,應在現代C工作方案++(C++ 17標準,包括所有TS),因爲這是一個理論,而不是實際的問題。

+0

給定一個適當的參數列表,非類型模板參數一直可以被推導出來。給定一個數組時,會發生很多'std :: size_t'參數。雅克的「標籤」答案同樣適用。 – chris

+1

你可以有'template S(std :: integral_constant );' – aschepler

+0

不知道我明白你的意思。您能否以答案的形式詳細寫一下? – alexeykuzmin0

回答

4

但是,所有這些解決方法,我知道的是類型參數僅

的解決方法都不是類型特異性的 - 點是要堅持的東西在可以推導出的構造。因此,如果我們想要一個類型,我們這樣做:

template <class T> struct tag { }; 

struct S { 
    template <class T> 
    S(tag<T>); 
}; 

,如果我們想要一個int,我們做同樣的事情:

template <int I> struct val { }; 

struct S { 
    template <int I> 
    S(val<I>); 
}; 

對於價值觀,你甚至不需要來使用自己的標籤類型 - 您可以在std::integral_constant之上小包裝。