C++ 实现拉链功能

C++ 实现拉链功能,c++,variadic-templates,C++,Variadic Templates,这是我的代码(我甚至不确定它是否正确): 模板非类型参数必须是常量表达式。 i这是一个运行时变量,您不能将其用作模板参数。相关:问题:std::tuple\u元素但是i是一个运行时值-您不能在该上下文中使用它。1)barprint()的实现很好。不需要静态断言,因为这不会使用不匹配的包进行编译。2) 非类型模板参数必须是编译时常量。这只是基本的模板101,和压缩无关。在TMP中,您不应该为循环使用sizeof…(Args),而应该使用静态递归。3) 不需要从元组继承,是吗? template&l

这是我的代码(我甚至不确定它是否正确):


模板非类型参数必须是常量表达式。

i
这是一个运行时变量,您不能将其用作模板参数。

相关:问题:
std::tuple\u元素
但是
i
是一个运行时值-您不能在该上下文中使用它。1)bar
print()
的实现很好。不需要静态断言,因为这不会使用不匹配的包进行编译。2) 非类型模板参数必须是编译时常量。这只是基本的模板101,和压缩无关。在TMP中,您不应该为
循环使用
sizeof…(Args)
,而应该使用静态递归。3) 不需要从
元组继承,是吗?
template<typename... list> struct typeList;

template<typename, typename> struct zipper;
template<typename...L, typename...R> struct zipper<typeList<L...>, typeList<R...>>
{
    typedef std::tuple<std::pair<L,R>...> tuplez;
    static_assert(sizeof...(L)==sizeof...(R), "Mismatch number of Args...");

    static void print()
    {
    std::cout<<"The types are: "<<std::endl;
    for(int i=0; i<std::tuple_size<tuplez>::value ; ++i)
    std::cout<< "first : "<< typeid(typename std::tuple_element<i, tuplez>::type::first_type).name()<<
        "second : "<<typeid(typename std::tuple_element<i, tuplez>::type::second_type).name() <<std::endl;
    }
};
template<typename... list> struct typeList;

template<int n, typename T> struct printer
{
    static void print (){
        std::cout<< "first : "<< typeid(typename std::tuple_element<n, T>::type::first_type).name()<<
        "second : "<<typeid(typename std::tuple_element<n, T>::type::second_type).name() <<std::endl;
        printer<n-1,T>::print();
    }
};

template<typename, typename> struct zipper;
template<typename...L, typename...R> struct zipper<typeList<L...>, typeList<R...>>
{
    typedef std::tuple<std::pair<L,R>...> tuplez;

    static void print(){
    printer<std::tuple_size<tuplez>::value-1, tuplez>::print();
    }
};

template<typename T> struct printer<0,T>
{
    static void print (){
        std::cout<< "first : "<< typeid(typename std::tuple_element<0, T>::type::first_type).name()<<
        "second : "<<typeid(typename std::tuple_element<0, T>::type::second_type).name() <<std::endl;
    }
};