2017-04-02 147 views
0

我有一个模板类型:如何检查类型是一个给定的模板类型

template<class T> 
struct Shadow { 
    T field[100]; 
}; 

我想创建一个tuple,它的类型是Shadow实例,但不应该允许任何其他类型。例如,

tuple< Shadow<int>, Shadow<double> > x; // correct instantiation. 
tuple< Shadow<int>, double > x; // incorrect instantiation. 

我该如何做到这一点(并且在不正确的实例化的情况下编译器标记错误)?

+0

是'tuple'了'性病:: tuple'或你定义的类? – kennytm

+0

它不需要是std :: tuple,我可以包装。 – user1205476

回答

2

,我可以想像的包裹元组的可变参数模板结构(或类)中的溶液

#include <tuple> 

template <typename T> 
struct Shadow 
{ T field[100]; }; 

template <typename ... Ts> 
struct wrapTShadow 
{ std::tuple<Shadow<Ts>...> val; }; 

int main() 
{ 
    // contain a std::tuple<Shadow<int>, Shadow<double>> 
    wrapTShadow<int, double> wts; 
} 
+0

感谢您的建议。你能告诉我std :: tuple ...>是吗?我很困惑,你可以调用Shadow ,虽然“结构阴影”不接受可变模板! – user1205476

+1

@ user1205476 - 你必须区分'std :: tuple >'和'std :: tuple ...>';假设'... Ts'是'T1,T2,T3'; 'std :: tuple >'被解压缩为'std :: tuple >'(这对你来说是错误的); 'std :: tuple ...''被解压为'std :: tuple ,影子,影子>'(这就是你需要的,在这种情况下,我想) – max66

+0

@ user1205476 - ps:在alangab的解决方案中:它基于相同的想法,但是避免了包装结构的需要。更简单,更优雅,(我怀疑)更高效 – max66

2

你可以使用类型别名:

template<class ...Args> 
using shadow_tuple = std::tuple<Shadow<Args>...>; 

int main() 
{ 
    shadow_tuple<int, double> xx; 
    return 0; 
}