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 なプログラミングはこんな感じになるんですかねー。
{} の使い方ってこれで合っているのかしら…。
次元数を可変長にするともっと大変そう…。