fork download
  1. #include <iostream>
  2. #include <tuple>
  3. #include <type_traits>
  4.  
  5. #if 1 // Not in C++11 // make_index_sequence
  6. #include <cstdint>
  7.  
  8. template <std::size_t...> struct index_sequence {};
  9.  
  10. template <std::size_t N, std::size_t... Is>
  11. struct make_index_sequence : make_index_sequence<N - 1, N - 1, Is...> {};
  12.  
  13. template <std::size_t... Is>
  14. struct make_index_sequence<0u, Is...> : index_sequence<Is...> {};
  15.  
  16. #endif // make_index_sequence
  17.  
  18. template <typename TReturn, typename...TArgs>
  19. struct SomeFunction{
  20. using ReturnType = TReturn;
  21. using ArgTypes = std::tuple<TArgs...>;
  22.  
  23. TReturn operator () (TArgs... args) const
  24. {
  25. const int dummy[] = {0, ((std::cout << args),0 )...};
  26. static_cast<void>(dummy);
  27. }
  28. };
  29.  
  30.  
  31.  
  32. template <typename TFunction, typename TupleArg = typename TFunction::ArgTypes>
  33. class Task;
  34.  
  35.  
  36. template <typename TFunction, typename... TArgs>
  37. class Task<TFunction, std::tuple<TArgs...>>
  38. {
  39. public:
  40. Task(TFunction fun, TArgs...args) : fun_(fun), args_(args...) {}
  41. void operator()()
  42. {
  43. call(make_index_sequence<sizeof...(TArgs)>{});
  44. }
  45. private:
  46. template <std::size_t ... Is>
  47. void call(index_sequence<Is...>)
  48. {
  49. fun_(std::get<Is>(args_)...);
  50. }
  51. private:
  52. TFunction fun_;
  53. std::tuple<TArgs...> args_;
  54. };
  55.  
  56. int main()
  57. {
  58. SomeFunction<void, int, char> f;
  59. Task<SomeFunction<void, int, char>> task(f, 42, 'c');
  60.  
  61. task();
  62.  
  63. return 0;
  64. }
  65.  
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
42c