fork download
  1. #include <iostream>
  2. #include <utility>
  3. #include <tuple>
  4.  
  5. namespace details
  6. {
  7.  
  8. template<std::size_t I = 0, typename FuncT, typename... Tp>
  9. inline typename std::enable_if<I == sizeof...(Tp), void>::type
  10. for_each(const std::tuple<Tp...> &, FuncT) // Unused arguments are given no names.
  11. { }
  12.  
  13. template<std::size_t I = 0, typename FuncT, typename... Tp>
  14. inline typename std::enable_if<I < sizeof...(Tp), void>::type
  15. for_each(const std::tuple<Tp...>& t, FuncT f)
  16. {
  17. f(std::get<I>(t));
  18. for_each<I + 1, FuncT, Tp...>(t, f);
  19. }
  20.  
  21. template <typename T>
  22. struct traverseType
  23. {
  24. void operator () (const T& t)
  25. {
  26. std::cout << "it is a generic T:" << t << std::endl;
  27. }
  28. };
  29.  
  30. template <>
  31. struct traverseType<int>
  32. {
  33. void operator () (int i)
  34. {
  35. std::cout << "it is a int:" << i << std::endl;
  36. }
  37. };
  38.  
  39. struct traverseTypeCaller
  40. {
  41. template <typename T>
  42. void operator () (const T& t)
  43. {
  44. details::traverseType<T>()(t);
  45. }
  46. };
  47.  
  48. template <typename ...T>
  49. struct traverseType<std::tuple<T...>>
  50. {
  51. void operator () (const std::tuple<T...>& t)
  52. {
  53. std::cout << "it is a tuple:" << std::endl;
  54. for_each(t, traverseTypeCaller());
  55. }
  56. };
  57.  
  58. }
  59.  
  60. template <typename T>
  61. void traverseType(const T& t)
  62. {
  63. details::traverseTypeCaller()(t);
  64. }
  65.  
  66. int main()
  67. {
  68. const auto t = std::make_tuple(42, '*', std::make_tuple(4, 2));
  69.  
  70. traverseType(t);
  71.  
  72. return 0;
  73. }
  74.  
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
it is a tuple:
it is a int:42
it is a generic T:*
it is a tuple:
it is a int:4
it is a int:2