fork download
  1. #include <iostream>
  2. #include <limits>
  3. #include <type_traits>
  4.  
  5. using namespace std;
  6.  
  7. struct vec
  8. { double x;double y;double z; };
  9.  
  10. namespace details
  11. {
  12. template <typename T>
  13. constexpr double X(const T& param) { return param.x; }
  14.  
  15. template <typename T>
  16. constexpr double Y(const T& param) { return param.y; }
  17.  
  18. template <typename T>
  19. constexpr double Z(const T& param) { return param.z; }
  20. }
  21.  
  22. template <typename T, typename = void>
  23. constexpr double (*my_temp[])(const vec&) = { &details::X<T>, &details::Y<T> };
  24.  
  25. template <typename T>
  26. constexpr double (*my_temp<T,
  27. enable_if_t<is_floating_point
  28. < decltype(details::X(T()))>::value>>[])(const vec&) =
  29. { &details::X<T>, &details::Y<T>, &details::Z<T> };
  30.  
  31.  
  32. int main() {
  33. vec foo = { 1.0, 2.0, 3.0 };
  34.  
  35. for(const auto i : my_temp<decltype(foo)>) {
  36. cout << (*i)(foo) << endl;
  37. }
  38. }
Success #stdin #stdout 0.01s 5320KB
stdin
Standard input is empty
stdout
1
2
3