fork download
  1. #include <string>
  2. #include <cstdint>
  3. #include <iostream>
  4. #include <tuple>
  5. #include <type_traits>
  6.  
  7.  
  8. template <typename T, typename... Ts> struct get_index;
  9.  
  10. template <typename T, typename... Ts>
  11. struct get_index<T, T, Ts...> : std::integral_constant<std::size_t, 0> {};
  12.  
  13. template <typename T, typename Tail, typename... Ts>
  14. struct get_index<T, Tail, Ts...> :
  15. std::integral_constant<std::size_t, 1 + get_index<T, Ts...>::value> {};
  16.  
  17. template <typename T, typename Tuple> struct get_index_in_tuple;
  18.  
  19. template <typename T, typename ... Ts>
  20. struct get_index_in_tuple<T, std::tuple<Ts...>> : get_index<T, Ts...> {};
  21.  
  22.  
  23. class Aggregate
  24. {
  25. public:
  26. std::string asString() { return "Hello world"; }
  27. uint32_t asInt() { return 42u; }
  28. private:
  29. // some conglomerate data
  30. };
  31.  
  32. template <typename T>
  33. T get(Aggregate& aggregate)
  34. {
  35. using types = std::tuple<uint32_t, std::string>;
  36. auto funcs = std::make_tuple(&Aggregate::asInt, &Aggregate::asString);
  37.  
  38. return (aggregate.* (std::get<get_index_in_tuple<T, types>::value>(funcs)))();
  39. }
  40.  
  41. int main()
  42. {
  43. Aggregate a;
  44. std::cout << get<uint32_t>(a) << std::endl;
  45. std::cout << get<std::string>(a) << std::endl;
  46. //get<double>(a); // Fail to compile
  47. return 0;
  48. }
  49.  
Success #stdin #stdout 0s 3428KB
stdin
Standard input is empty
stdout
42
Hello world