fork download
  1. #include <iostream>
  2. #include <type_traits>
  3. #include <tuple>
  4. #include <array>
  5. using namespace std;
  6.  
  7. template<typename>
  8. struct TypeTeller;
  9.  
  10. template<typename T>
  11. void tellType(T t) { (void) TypeTeller<T>(); }
  12.  
  13. template<typename T>
  14. void tellType() { (void) TypeTeller<T>(); }
  15.  
  16. template<typename F, typename... Ts>
  17. struct runner
  18. {
  19. F f;
  20. tuple<Ts...> payload;
  21.  
  22. template<int I>
  23. static auto getRunner()
  24. {
  25. return +[](F& f, tuple<Ts...>& t) -> decltype(auto)
  26. {
  27. return f(std::forward<decltype(get<I>(t))>(get<I>(t)));
  28. };
  29. }
  30.  
  31. template<int... Ids>
  32. static auto generateRunnersHelper(std::integer_sequence<int, Ids...> is)
  33. {
  34. return std::array<decltype(getRunner<0>()), sizeof...(Ts)>{{ getRunner<Ids>()... }};
  35. }
  36.  
  37. static auto generateRunners()
  38. {
  39. return generateRunnersHelper(std::make_integer_sequence<int, sizeof...(Ts)>{});
  40. }
  41.  
  42. decltype(auto) run(int nth)
  43. {
  44. static auto runners = generateRunners();
  45. return runners[nth](f, payload);
  46. }
  47. };
  48.  
  49. template<typename F, typename... Ts>
  50. runner<F, Ts...> makeRunner(tuple<Ts...> t, F f)
  51. {
  52. return {f, t};
  53. }
  54.  
  55. int main() {
  56. auto t = make_tuple(42, "Dd", 3.14f);
  57. auto magic = makeRunner(t, [] (auto x) {
  58. cout << x << '\n';
  59. });
  60.  
  61. int n;
  62. while(cin >> n) magic.run(n);
  63. return 0;
  64. }
Success #stdin #stdout 0s 3464KB
stdin
2 0 1
stdout
3.14
42
Dd