Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- template <size_t SIZE, size_t i, typename T>
- void toArray(T(&target)[SIZE], const T& t)
- {
- target[i] = t;
- }
- template <size_t SIZE, size_t i, typename T, typename... Rest>
- void toArray(T(&target)[SIZE], const T& t, const Rest&... rest)
- {
- target[i] = t;
- toArray<SIZE, i + 1, Rest...>(target, rest...);
- }
- template <size_t I, typename T>
- struct vec
- {
- union {
- T elements[I];
- };
- template <typename... Rest>
- vec(const Rest& ... rest)
- {
- static_assert(sizeof...(Rest) == I, "A vec cannot be initialized with the wrong number of arguments!");
- T unpacked[I];
- toArray<I, 0, Rest...>(unpacked, rest...);
- for (size_t i = 0; i < I; i++)
- elements[i] = unpacked[i];
- };
- template <size_t J, typename U, typename... Rest>
- vec(const vec<J, U>& other, const Rest&... rest)
- {
- static_assert(J + sizeof...(Rest) >= I, "A vec cannot be initialized with the wrong number of arguments!");
- if constexpr (I < J || I == J) {
- for (size_t i = 0; i < I; i++)
- elements[i] = other.elements[i];
- } else {
- for (size_t i = 0; i < J; i++)
- elements[i] = other.elements[i];
- T unpacked[sizeof...(Rest)];
- toArray<sizeof...(Rest), 0, Rest...>(unpacked, rest...);
- for (size_t i = J; i < I; i++)
- elements[i] = unpacked[i - J];
- }
- };
- std::string toString()
- {
- std::string str = "[";
- for (size_t i = 0; i < I; i++)
- str.append( std::to_string(elements[i]) + ((i != I - 1)?(", "):("")) );
- str.append("]\n");
- return str;
- }
- };
- using vec1f = vec<1, float>;
- using vec2f = vec<2, float>;
- using vec3f = vec<3, float>;
- using vec4f = vec<4, float>;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement