template <template <class...> class Type_container, class... T1s, class... T2s>
constexpr auto concat(Type_container<T1s...>, Type_container<T2s...>) {
return Type_container<T1s..., T2s...>{};
}
template <class Seq1, class Seq2, class... Seqs>
constexpr auto concat(Seq1 s1, Seq2 s2, Seqs... s) {
return concat(s1, concat(s2, s...));
}
template <typename...>
struct Type_list{};
using list1 = Type_list<int>;
using list2 = Type_list<char>;
using list3 = Type_list<bool>;
#include <cstdio>
template <typename T>
void print_type(T) {
puts(__PRETTY_FUNCTION__);
}
int main(){
print_type(concat(list1{}, list2{}, list3{}));
}
dGVtcGxhdGUgPHRlbXBsYXRlIDxjbGFzcy4uLj4gY2xhc3MgVHlwZV9jb250YWluZXIsIGNsYXNzLi4uIFQxcywgY2xhc3MuLi4gVDJzPgpjb25zdGV4cHIgYXV0byBjb25jYXQoVHlwZV9jb250YWluZXI8VDFzLi4uPiwgVHlwZV9jb250YWluZXI8VDJzLi4uPikgewogICAgcmV0dXJuIFR5cGVfY29udGFpbmVyPFQxcy4uLiwgVDJzLi4uPnt9Owp9CnRlbXBsYXRlIDxjbGFzcyBTZXExLCBjbGFzcyBTZXEyLCBjbGFzcy4uLiBTZXFzPgpjb25zdGV4cHIgYXV0byBjb25jYXQoU2VxMSBzMSwgU2VxMiBzMiwgU2Vxcy4uLiBzKSB7CiAgICByZXR1cm4gY29uY2F0KHMxLCBjb25jYXQoczIsIHMuLi4pKTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lLi4uPgpzdHJ1Y3QgVHlwZV9saXN0e307Cgp1c2luZyBsaXN0MSA9IFR5cGVfbGlzdDxpbnQ+Owp1c2luZyBsaXN0MiA9IFR5cGVfbGlzdDxjaGFyPjsKdXNpbmcgbGlzdDMgPSBUeXBlX2xpc3Q8Ym9vbD47CgojaW5jbHVkZSA8Y3N0ZGlvPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgcHJpbnRfdHlwZShUKSB7CiAgICBwdXRzKF9fUFJFVFRZX0ZVTkNUSU9OX18pOwp9CgppbnQgbWFpbigpewoJcHJpbnRfdHlwZShjb25jYXQobGlzdDF7fSwgbGlzdDJ7fSwgbGlzdDN7fSkpOwp9Cg==