2012-12-17 45 views
0

我想能夠推斷給定的類型是否是模板類型。我已經通過升壓轉換器的類型特點班找,但是找不到相關的模板,確保對方*性狀: http://www.boost.org/doc/libs/1_52_0/libs/type_traits/doc/html/index.html有沒有辦法使用C++類型特徵來檢查類型是否是模板及其屬性?

會更有趣的是,如果有在編譯時的方法來確定模板參數的屬性,例如什麼如多少個模板參數或參數是模板模板參數。

+0

如果你能對*非類型模板參數忘記*則是一個非常簡單的事情,在C++做的,特別是++ 11 –

+0

@ K-ballo:你仍然難以計算模板模板參數... –

+2

A *類型*從來就不是模板類型!不過,這可能是由模板實例化引起的,我想這就是你的意思。但問題是,你爲什麼要關心? –

回答

3

這裏的部分解決方案:

#include <iostream> 
#include <type_traits> 

template <typename> struct is_template : std::false_type {}; 

template <template <typename...> class Tmpl, typename ...Args> 
struct is_template<Tmpl<Args...>> : std::true_type {}; 


template <typename> struct Foo {}; 

int main() 
{ 
    std::cout << is_template<int>::value << std::endl; 
    std::cout << is_template<Foo<char>>::value << std::endl; 
} 

的問題是,一個模板可以有任意的結構,所以它需要的不只是包括類型參數。您無法詳盡列舉全部種模板參數。

但是,採取這種做法一分鐘,一個arugment計數器容易進行:

template <typename> struct nargs : std::integral_constant<unsigned int, 0> { }; 

template <template <typename...> class Tmpl, typename ...Args> 
struct nargs<Tmpl<Args...> : std::integral_constant<unsigned int, sizeof...(Args)> { }; 
相關問題