fork download
  1. #include <iostream>
  2.  
  3. template<typename T, size_t D>
  4. struct VectorBase;
  5.  
  6. template<typename T>
  7. struct VectorBase<T, 2>
  8. {
  9. constexpr VectorBase() : v{} {}
  10. union {
  11. T v[2];
  12. struct { T x, y; };
  13. };
  14. };
  15.  
  16. template<typename T>
  17. struct VectorBase<T, 3>
  18. {
  19. constexpr VectorBase() : v{} {}
  20. union {
  21. T v[3];
  22. struct { T x, y, z; };
  23. };
  24. };
  25.  
  26. template<typename T>
  27. struct VectorBase<T, 4>
  28. {
  29. constexpr VectorBase() : v{} {}
  30. union {
  31. T v[4];
  32. struct { T x, y, z, w; };
  33. };
  34. };
  35.  
  36. template<typename T, size_t D>
  37. struct Vector : public VectorBase<T, D>
  38. {
  39. using VectorBase<T, D>::v;
  40. using size_type = decltype(D);
  41. using value_type = T;
  42.  
  43. constexpr Vector() : VectorBase<T,D>{} {}
  44. constexpr Vector(T scalar) {
  45. std::fill(std::begin(v), std::end(v), scalar);
  46. }
  47.  
  48. constexpr T& operator[](size_type i) const noexcept { return v[i]; }
  49. constexpr const T& operator[](size_type i) noexcept { return v[i]; }
  50.  
  51. constexpr size_type size() const noexcept { return D; }
  52.  
  53. constexpr T* data() noexcept { return &v[0]; }
  54. constexpr const T* data() const noexcept { return &v[0]; }
  55. };
  56.  
  57. template<typename T>
  58. using Vector2 = Vector<T, 2>;
  59. template<typename T>
  60. using Vector3 = Vector<T, 3>;
  61. template<typename T>
  62. using Vector4 = Vector<T, 4>;
  63.  
  64. int main() {
  65. Vector3<int> v{1};
  66.  
  67. std::cout << v[0] << ", " << v.z << "\n";
  68. return 0;
  69. }
  70.  
  71.  
Success #stdin #stdout 0s 3468KB
stdin
Standard input is empty
stdout
1, 1