#include <iostream>
#include <utility>

using namespace std;
template<typename... list> struct typeList;


template<typename, typename> struct zipper;
template<typename...L, typename...R> struct zipper<typeList<L...>, typeList<R...>> : std::tuple<std::pair<L,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(std::tuple_element<i, tuplez>::type::first_type).name()<<
        "second : "<<typeid(std::tuple_element<i, tuplez>::type::second_type).name() <<std::endl;
    }
};

int main()
{
    zipper<typeList<int,double>, typeList<char,int>>::print();
    return 0;
}
