如何将两个参数包一起使用?

时间:2014-04-09 13:38:29

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

例如,我有一个带有两个参数包的代码

template<class... Ts, int... Is>
struct B
{

};

int main()
{
    B<int, double, 0, 1> b; // compile error here
    return 0;
}

任何获得的方式都是对的?

3 个答案:

答案 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 */>;

如果那不是您想要的,我会使用其他人建议的类型列表部分专业化方法。