#include <iostream>
#include <typeinfo>
#include <cxxabi.h>

template <typename...> struct join;

template <template <typename...> class Tpl,
          template <typename...> class...,
          typename... Args>
struct join<Tpl<Args...>...>
{
    typedef Tpl<Args......> type;
};

template <typename...> struct test {};

int main()
{
	int status;
    std::cout << abi::__cxa_demangle(typeid(
        join
        <
            test<int, int, double>,
            test<double, char, test<int>>,
            test<double, double, const char>
        >::type).name(), 0, 0, &status) << std::endl;
        
	return 0;
}