X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flinal%2Fvector.h;h=31597d4282410e2606590eaea2faa6d3c22c2cd9;hb=0a8781509bafe347b9c32f1106891eac18354965;hp=c9b2a179fe5fd0ce595e4dda796b3c2d7b13ab5d;hpb=9ab061034720c1c0db4e8bff5dae4191ccd2a26f;p=libs%2Fmath.git diff --git a/source/linal/vector.h b/source/linal/vector.h index c9b2a17..31597d4 100644 --- a/source/linal/vector.h +++ b/source/linal/vector.h @@ -84,9 +84,14 @@ public: use by Matrix row accessor. */ Vector(const T *, unsigned); +#if __cplusplus >= 201103L + template + Vector(T, Args...); +#else Vector(T, T); Vector(T, T, T); Vector(T, T, T, T); +#endif template Vector(const Vector &); @@ -126,6 +131,18 @@ inline Vector::Vector(const T *d, unsigned stride) (*this)[i] = d[i*stride]; } +#if __cplusplus >= 201103L +template +template +inline Vector::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 { static_cast(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 @@ -151,6 +168,7 @@ inline Vector::Vector(T x_, T y_, T z_, T w_) this->VectorComponents::z = z_; this->VectorComponents::w = w_; } +#endif template template @@ -174,9 +192,9 @@ template inline Vector compose(T s, const Vector &v) { Vector r; + r[0] = s; for(unsigned i=0; i