2012-12-17 46 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)> { }; 
相关问题