]> git.tdb.fi Git - libs/math.git/blobdiff - source/linal/vector.h
Improve Vector constructor for C++11
[libs/math.git] / source / linal / vector.h
index 767cc88da2d5b5518adc72b00d5f7f55582f8963..31597d4282410e2606590eaea2faa6d3c22c2cd9 100644 (file)
@@ -84,9 +84,14 @@ public:
        use by Matrix row accessor. */
        Vector(const T *, unsigned);
 
+#if __cplusplus >= 201103L
+       template<typename... Args>
+       Vector(T, Args...);
+#else
        Vector(T, T);
        Vector(T, T, T);
        Vector(T, T, T, T);
+#endif
        template<typename U>
        Vector(const Vector<U, N> &);
 
@@ -126,6 +131,18 @@ inline Vector<T, N>::Vector(const T *d, unsigned stride)
                (*this)[i] = d[i*stride];
 }
 
+#if __cplusplus >= 201103L
+template<typename T, unsigned N>
+template<typename... Args>
+inline Vector<T, N>::Vector(T x_, Args... v)
+{
+       static_assert(1+sizeof...(v)==N, "Incorrect number of arguments in Vector constructor");
+       (*this)[0] = x_;
+       unsigned i = 1;
+       for(auto c: std::initializer_list<T> { static_cast<T>(v)... })
+               (*this)[i++] = c;
+}
+#else
 /* The compiler won't instantiate these unless they are used.  Trying to use
 them on the wrong class results in an error. */
 template<typename T, unsigned N>
@@ -151,6 +168,7 @@ inline Vector<T, N>::Vector(T x_, T y_, T z_, T w_)
        this->VectorComponents<T, 4>::z = z_;
        this->VectorComponents<T, 4>::w = w_;
 }
+#endif
 
 template<typename T, unsigned N>
 template<typename U>