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

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

template <typename...> struct join;

template
<
	template <typename... HeadArgs> class Head,
	template <typename... TailArgs> class...
>
struct join<class Head<typename HeadArgs...>, class Head<typename TailArgs...>...>
{
    typedef typename Head<typename HeadArgs..., typename TailArgs......> result;
};

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

	return 0;
}