constexpr を使用したベクトル演算を簡単に書いてみた
ベクトル型同士の演算しか出来ませんが、簡単に書いてみました。
[ソース]
#include <iostream> template<typename T> struct vec3{ typedef T value_type; static int const dimension = 3; union{ struct{ value_type x, y, z; }; value_type array[dimension]; }; }; template<typename T> constexpr vec3<T> make_vec(T x, T y, T z){ return vec3<T>{{ x, y, z }}; } template<typename T> constexpr bool operator ==(vec3<T> const& a, vec3<T> const& b){ return a.x == b.x && a.y == b.y && a.z == b.z; } template<typename T> constexpr vec3<T> operator +(vec3<T> const& a, vec3<T> const& b){ return make_vec(a.x + b.x, a.y + b.y, a.z + b.z); } template<typename T> constexpr vec3<T> operator -(vec3<T> const& a, vec3<T> const& b){ return make_vec(a.x - b.x, a.y - b.y, a.z - b.z); } template<typename T> constexpr vec3<T> operator *(vec3<T> const& a, vec3<T> const& b){ return make_vec(a.x * b.x, a.y * b.y, a.z * b.z); } template<typename T> constexpr vec3<T> operator /(vec3<T> const& a, vec3<T> const& b){ return make_vec(a.x / b.x, a.y / b.y, a.z / b.z); } template<typename T> std::ostream& operator <<(std::ostream& os, vec3<T> const& v){ os << v.x << ", " << v.y << ", " << v.z; return os; } int main(){ constexpr auto v = make_vec( 0, 1, 2 ); constexpr auto v2 = make_vec( 1, 2, 3 ); constexpr auto v3 = v + v2 * v / v2 - v; static_assert(v3 == v, ""); std::cout << v3 << std::endl; return 0; }
[出力]
0, 1, 2
constexpr なプログラミングはこんな感じになるんですかねー。
{} の使い方ってこれで合っているのかしら…。
次元数を可変長にするともっと大変そう…。