#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CiNpbmNsdWRlIDxjeHhhYmkuaD4KCnRlbXBsYXRlIDx0eXBlbmFtZS4uLj4gc3RydWN0IGpvaW47Cgp0ZW1wbGF0ZSA8dGVtcGxhdGUgPHR5cGVuYW1lLi4uPiBjbGFzcyBUcGwsCiAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4+IGNsYXNzLi4uLAogICAgICAgICAgdHlwZW5hbWUuLi4gQXJncz4Kc3RydWN0IGpvaW48VHBsPEFyZ3MuLi4+Li4uPgp7CiAgICB0eXBlZGVmIFRwbDxBcmdzLi4uLi4uPiB0eXBlOwp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lLi4uPiBzdHJ1Y3QgdGVzdCB7fTsKCmludCBtYWluKCkKewoJaW50IHN0YXR1czsKICAgIHN0ZDo6Y291dCA8PCBhYmk6Ol9fY3hhX2RlbWFuZ2xlKHR5cGVpZCgKICAgICAgICBqb2luCiAgICAgICAgPAogICAgICAgICAgICB0ZXN0PGludCwgaW50LCBkb3VibGU+LAogICAgICAgICAgICB0ZXN0PGRvdWJsZSwgY2hhciwgdGVzdDxpbnQ+PiwKICAgICAgICAgICAgdGVzdDxkb3VibGUsIGRvdWJsZSwgY29uc3QgY2hhcj4KICAgICAgICA+Ojp0eXBlKS5uYW1lKCksIDAsIDAsICZzdGF0dXMpIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAKCXJldHVybiAwOwp9
prog.cpp:10:25: error: expansion pattern 'Tpl<Args ...>' contains no argument packs
prog.cpp: In function 'int main()':
prog.cpp:21:9: error: incomplete type 'join<test<int, int, double>, test<double, char, test<int> >, test<double, double, const char> >' used in nested name specifier