例如,我有一个带有两个参数包的代码
template<class... Ts, int... Is>
struct B
{
};
int main()
{
B<int, double, 0, 1> b; // compile error here
return 0;
}
任何获得的方式都是对的?
答案 0 :(得分:6)
这是不允许的。但是你可以这样做:
template<typename ...> struct typelist {};
template<typename TypeList, int... Is>
struct B; //primary template. Only declaration!
template<typename ... Ts, int ... Is>
struct B<typelist<Ts...>, Is...> //partial specialization
{
//here you know Ts... and Is... Use them!
};
int main()
{
B<typelist<int, double>, 0, 1> b;
return 0;
}
答案 1 :(得分:2)
您可以引入帮助程序模板来引入类型/整数列表:
template<typename TList, typename IList> struct X;
template<
template<typename ...> class TList, typename ...Ts,
template<int ...> class IList, int ...Is>
struct X <TList<Ts...>, IList<Is...> >
{
};
template<typename ...Ts> struct TList {};
template<int ...Is> struct IList {};
int main()
{
X<TList<int, double>, IList<0, 1> > x;
return 0;
}
答案 2 :(得分:2)
我认为这会受到XY问题的困扰。如果我理解得很好,你想要的是传递任意数量的不同类型。
你可以使用std::integral_constant
:
template<typename... INTS>
struct foo
{
...
};
template<typename T , T n>
using number = std::integral_constant<T,n>; //An alias for less typing...
foo<number<int,-1>,number<unsigned int,1>, /* etc */>;
如果那不是您想要的,我会使用其他人建议的类型列表部分专业化方法。