fork(1) download
  1. #include <iostream>
  2. #include <type_traits>
  3.  
  4. namespace detail
  5. {
  6. template <typename T>
  7. decltype(T::num_components, void(), std::true_type{}) has_num_components_impl(int);
  8.  
  9. template <typename T>
  10. std::false_type has_num_components_impl(...);
  11. }
  12.  
  13. template <typename T>
  14. using has_num_components = decltype(detail::has_num_components_impl<T>(0));
  15.  
  16. template <typename T>
  17. std::enable_if_t<!has_num_components<T>::value, std::size_t>
  18. get_num_components() { return 1; }
  19.  
  20. template <typename T>
  21. std::enable_if_t<has_num_components<T>::value, std::size_t>
  22. get_num_components() { return T::num_components; }
  23.  
  24.  
  25. template<class T>
  26. void EmitAttribute(T const & v, int stride, int offset, int i)
  27. {
  28. std::cout << "Stride is "
  29. << stride
  30. << " element index "
  31. << i
  32. << " is at offset "
  33. << offset
  34. << " has "
  35. << get_num_components<T>()
  36. << " component "
  37. << std::endl;
  38. }
  39.  
  40. template<class T, int C>
  41. struct vec
  42. {
  43. typedef T value_type;
  44.  
  45. enum { num_components = C };
  46. };
  47.  
  48. int main() {
  49. vec<int, 42> v;
  50.  
  51. EmitAttribute(v, 1, 2, 3);
  52. EmitAttribute(42, 1, 2, 3);
  53. }
Success #stdin #stdout 0s 3096KB
stdin
Standard input is empty
stdout
Stride is 1 element index 3 is at offset 2 has 42 component 
Stride is 1 element index 3 is at offset 2 has 1 component