如何检查类型是给定的模板类型

时间:2017-04-02 18:06:08

标签: c++ c++11 templates variadic-templates

我有一个模板类型:

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.

如何实现这一点(如果实例化不正确,编译器标记错误)?

2 个答案:

答案 0 :(得分:2)

我能想象的解决方案是将元组包装在可变参数模板struct(或类)中

#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;
 }

答案 1 :(得分:2)

您可以使用类型别名:

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

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