fork download
  1. #include <iostream>
  2. #include <typeinfo>
  3. #include <utility>
  4. // for demangle:
  5. #include <cxxabi.h>
  6. #include <string>
  7. #include <memory>
  8. #include <cstdlib>
  9.  
  10.  
  11. template<template<class T, T...> class Container, typename T, T... t, T... s>
  12. constexpr Container<T, t..., s...>
  13. concat_arglists(Container<T, t...>, Container<T, s...>) {
  14. return {};
  15. }
  16.  
  17. // swap_pairs: Пустой лист
  18. template <template<class T, T...> class Container, typename T>
  19. constexpr Container<T> swap_pairs(Container<T>) { return {}; }
  20.  
  21. // swap_pairs: Лист из 1 элемента
  22. template <template<class T, T...> class Container, typename T, T t>
  23. constexpr Container<T, t> swap_pairs(Container<T, t>) { return {}; }
  24.  
  25. // swap_pairs: Лист из 2 более элементов
  26. template <template<class T, T...> class Container, typename T, T t1, T t2, T... ts>
  27. constexpr auto
  28. swap_pairs(Container<T, t1, t2, ts...>) {
  29. using head = Container<T, t2, t1>;
  30. using tail = decltype(swap_pairs(Container<T, ts...>{}));
  31. using list = decltype(concat_arglists(head{}, tail{}));
  32. return list{};
  33. }
  34.  
  35. std::string demangle(const char* mangled)
  36. {
  37. int status;
  38. std::unique_ptr<char[], void (*)(void*)> result(
  39. abi::__cxa_demangle(mangled, 0, 0, &status), std::free);
  40. return result.get() ? std::string(result.get()) : "error occurred";
  41. }
  42.  
  43. int main() {
  44. std::integer_sequence<int, 2, 1, 4, 3> a;
  45. std::integer_sequence<int, 4, 5, 2, 3, 1> b;
  46. auto c = concat_arglists(a, b);
  47. auto d = swap_pairs(c);
  48. std::cout << "a = " << demangle( typeid(a).name() ) << std::endl;
  49. std::cout << "b = " << demangle( typeid(b).name() ) << std::endl;
  50. std::cout << "c = " << demangle( typeid(c).name() ) << std::endl;
  51. std::cout << "d = " << demangle( typeid(d).name() ) << std::endl;
  52. return 0;
  53. }
  54.  
Success #stdin #stdout 0s 4416KB
stdin
Standard input is empty
stdout
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>