#include <iostream>
#include <typeinfo>
#include <utility>
// for demangle:
#include <cxxabi.h>
#include <string>
#include <memory>
#include <cstdlib>
template<template<class T, T...> class Container, typename T, T... t, T... s>
constexpr Container<T, t..., s...>
concat_arglists(Container<T, t...>, Container<T, s...>) {
return {};
}
// swap_pairs: Пустой лист
template <template<class T, T...> class Container, typename T>
constexpr Container<T> swap_pairs(Container<T>) { return {}; }
// swap_pairs: Лист из 1 элемента
template <template<class T, T...> class Container, typename T, T t>
constexpr Container<T, t> swap_pairs(Container<T, t>) { return {}; }
// swap_pairs: Лист из 2 более элементов
template <template<class T, T...> class Container, typename T, T t1, T t2, T... ts>
constexpr auto
swap_pairs(Container<T, t1, t2, ts...>) {
using head = Container<T, t2, t1>;
using tail = decltype(swap_pairs(Container<T, ts...>{}));
using list = decltype(concat_arglists(head{}, tail{}));
return list{};
}
std::string demangle(const char* mangled)
{
int status;
std::unique_ptr<char[], void (*)(void*)> result(
abi::__cxa_demangle(mangled, 0, 0, &status), std::free);
return result.get() ? std::string(result.get()) : "error occurred";
}
int main() {
std::integer_sequence<int, 2, 1, 4, 3> a;
std::integer_sequence<int, 4, 5, 2, 3, 1> b;
auto c = concat_arglists(a, b);
auto d = swap_pairs(c);
std::cout << "a = " << demangle( typeid(a).name() ) << std::endl;
std::cout << "b = " << demangle( typeid(b).name() ) << std::endl;
std::cout << "c = " << demangle( typeid(c).name() ) << std::endl;
std::cout << "d = " << demangle( typeid(d).name() ) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CiNpbmNsdWRlIDx1dGlsaXR5PgovLyBmb3IgZGVtYW5nbGU6CiNpbmNsdWRlIDxjeHhhYmkuaD4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPGNzdGRsaWI+CgoKdGVtcGxhdGU8dGVtcGxhdGU8Y2xhc3MgVCwgVC4uLj4gY2xhc3MgQ29udGFpbmVyLCB0eXBlbmFtZSBULCBULi4uIHQsIFQuLi4gcz4KY29uc3RleHByIENvbnRhaW5lcjxULCB0Li4uLCBzLi4uPgpjb25jYXRfYXJnbGlzdHMoQ29udGFpbmVyPFQsIHQuLi4+LCBDb250YWluZXI8VCwgcy4uLj4pIHsKCXJldHVybiB7fTsKfQoKLy8gc3dhcF9wYWlyczog0J/Rg9GB0YLQvtC5INC70LjRgdGCCnRlbXBsYXRlIDx0ZW1wbGF0ZTxjbGFzcyBULCBULi4uPiBjbGFzcyBDb250YWluZXIsIHR5cGVuYW1lIFQ+CmNvbnN0ZXhwciBDb250YWluZXI8VD4gc3dhcF9wYWlycyhDb250YWluZXI8VD4pIHsgcmV0dXJuIHt9OyB9CgovLyBzd2FwX3BhaXJzOiDQm9C40YHRgiDQuNC3IDEg0Y3Qu9C10LzQtdC90YLQsAp0ZW1wbGF0ZSA8dGVtcGxhdGU8Y2xhc3MgVCwgVC4uLj4gY2xhc3MgQ29udGFpbmVyLCB0eXBlbmFtZSBULCBUIHQ+CmNvbnN0ZXhwciBDb250YWluZXI8VCwgdD4gc3dhcF9wYWlycyhDb250YWluZXI8VCwgdD4pIHsgcmV0dXJuIHt9OyB9CgovLyBzd2FwX3BhaXJzOiDQm9C40YHRgiDQuNC3IDIgINCx0L7Qu9C10LUg0Y3Qu9C10LzQtdC90YLQvtCyCnRlbXBsYXRlIDx0ZW1wbGF0ZTxjbGFzcyBULCBULi4uPiBjbGFzcyBDb250YWluZXIsIHR5cGVuYW1lIFQsIFQgdDEsIFQgdDIsIFQuLi4gdHM+CmNvbnN0ZXhwciBhdXRvCnN3YXBfcGFpcnMoQ29udGFpbmVyPFQsIHQxLCB0MiwgdHMuLi4+KSB7Cgl1c2luZyBoZWFkID0gQ29udGFpbmVyPFQsIHQyLCB0MT47Cgl1c2luZyB0YWlsID0gZGVjbHR5cGUoc3dhcF9wYWlycyhDb250YWluZXI8VCwgdHMuLi4+e30pKTsKCXVzaW5nIGxpc3QgPSBkZWNsdHlwZShjb25jYXRfYXJnbGlzdHMoaGVhZHt9LCB0YWlse30pKTsKCXJldHVybiBsaXN0e307Cn0KCnN0ZDo6c3RyaW5nIGRlbWFuZ2xlKGNvbnN0IGNoYXIqIG1hbmdsZWQpCnsKICAgICAgaW50IHN0YXR1czsKICAgICAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXSwgdm9pZCAoKikodm9pZCopPiByZXN1bHQoCiAgICAgICAgYWJpOjpfX2N4YV9kZW1hbmdsZShtYW5nbGVkLCAwLCAwLCAmc3RhdHVzKSwgc3RkOjpmcmVlKTsKICAgICAgcmV0dXJuIHJlc3VsdC5nZXQoKSA/IHN0ZDo6c3RyaW5nKHJlc3VsdC5nZXQoKSkgOiAiZXJyb3Igb2NjdXJyZWQiOwp9CgppbnQgbWFpbigpIHsKCXN0ZDo6aW50ZWdlcl9zZXF1ZW5jZTxpbnQsIDIsIDEsIDQsIDM+IGE7CglzdGQ6OmludGVnZXJfc2VxdWVuY2U8aW50LCA0LCA1LCAyLCAzLCAxPiBiOwoJYXV0byBjID0gY29uY2F0X2FyZ2xpc3RzKGEsIGIpOwoJYXV0byBkID0gc3dhcF9wYWlycyhjKTsKCXN0ZDo6Y291dCA8PCAiYSA9ICIgPDwgZGVtYW5nbGUoIHR5cGVpZChhKS5uYW1lKCkgKSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgImIgPSAiIDw8IGRlbWFuZ2xlKCB0eXBlaWQoYikubmFtZSgpICkgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICJjID0gIiA8PCBkZW1hbmdsZSggdHlwZWlkKGMpLm5hbWUoKSApIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCAiZCA9ICIgPDwgZGVtYW5nbGUoIHR5cGVpZChkKS5uYW1lKCkgKSA8PCBzdGQ6OmVuZGw7CglyZXR1cm4gMDsKfQo=
a = std::integer_sequence<int, 2, 1, 4, 3>
b = std::integer_sequence<int, 4, 5, 2, 3, 1>
c = std::integer_sequence<int, 2, 1, 4, 3, 4, 5, 2, 3, 1>
d = std::integer_sequence<int, 1, 2, 3, 4, 5, 4, 3, 2, 1>