fork download
  1. #include <iostream>
  2. #include <tuple>
  3. #include <cassert>
  4.  
  5. struct foo
  6. {
  7. foo() = delete;
  8.  
  9. foo(int i, int k)
  10. : i(i), k(k){}
  11.  
  12. void operator()()
  13. { std::cout << i << " " << k << std::endl;}
  14.  
  15. int i;
  16. int k;
  17. };
  18.  
  19. struct bar
  20. {
  21. bar() = delete;
  22.  
  23. bar(int x)
  24. : x(x){}
  25.  
  26. void operator()()
  27. { std::cout << x << std::endl;}
  28.  
  29. int x;
  30. };
  31.  
  32.  
  33. template <size_t I>
  34. struct visit_impl
  35. {
  36. template <typename T, typename F>
  37. static void visit(T& tup, size_t idx, F fun)
  38. {
  39. if (idx == I - 1) fun(std::get<I - 1>(tup));
  40. else visit_impl<I - 1>::visit(tup, idx, fun);
  41. }
  42. };
  43.  
  44. template <>
  45. struct visit_impl<0>
  46. {
  47. template <typename T, typename F>
  48. static void visit(T& tup, size_t idx, F fun) { assert(false); }
  49. };
  50.  
  51. /// visit at runtime the tuple item at idx and run F
  52. template <typename F, typename... Ts>
  53. void visit_at(std::tuple<Ts...> const& tup, size_t idx, F fun)
  54. {
  55. visit_impl<sizeof...(Ts)>::visit(tup, idx, fun);
  56. }
  57.  
  58. /// visit at runtime the tuple item at idx and run F
  59. template <typename F, typename... Ts>
  60. void visit_at(std::tuple<Ts...>& tup, size_t idx, F fun)
  61. {
  62. visit_impl<sizeof...(Ts)>::visit(tup, idx, fun);
  63. }
  64.  
  65. /// make an object
  66. template <typename T, typename... Args>
  67. T make_class(Args ...args)
  68. {
  69. return T(args...);
  70. }
  71.  
  72. template <typename... Args>
  73. void make_classes(Args... args)
  74. {
  75. auto t = std::tuple<Args...>(args...);
  76. unsigned int size = std::tuple_size<decltype(t)>::value;
  77. auto execute = [](auto & obj){ obj.operator()(); };
  78.  
  79. for (int i = 0; i < size; i++) {
  80. visit_at(t, i, execute);
  81. }
  82. }
  83.  
  84. int main()
  85. {
  86. make_classes(
  87. foo(2, 6),
  88. bar(3),
  89. foo(10,11),
  90. bar(9)
  91. );
  92. }
  93.  
Success #stdin #stdout 0s 3468KB
stdin
Standard input is empty
stdout
2 6
3
10 11
9