vec::dimension

ベクトルの次元数の取得を行います。

#include 
#include 

#include "vec/vec.hpp"
#include "vec/type_traits/dimension.hpp"
#include "vec/preprocessor/make_type_traits_value.hpp"
#include "vec/preprocessor/make_type_traits_is_vec.hpp"

/**
    D3DVECTOR の特殊化
 */
KMT_EX_PP_MATH_VEC_MAKE_TYPE_TRAITS_VALUE(D3DVECTOR, float);
KMT_EX_PP_MATH_VEC_MAKE_TYPE_TRAITS_IS_VEC(D3DVECTOR);

#include "vec/preprocessor/undef_make_type_traits_value.hpp"    // #undef
#include "vec/preprocessor/undef_make_type_traits_is_vec.hpp"    // #undef

namespace vec = kmt_ex::math::vec;

typedef vec::vec<3, float>    vec3;
typedef vec::vec<24, float>    vec24;

int
main(){
    
    std::cout << vec::dimension::value << "\n";      //  3
    std::cout << vec::dimension::value << "\n";     // 23
    std::cout << vec::dimension::value << "\n"; //  3
    
    return 0;
}

他のベクトル型で使用するには、
vec::is_vec と vec::value の特殊化を行う必要があります。
内部では、
T型のサイズ/値の型のサイズ
で、求めているので仮想関数がある場合は正しい計算が出来ません。
型が仮想関数を持っているかどうかの判定って出来たっけか?

namespace detail{
    
    template<
        typename T,
        bool is_vec
    >
    struct dimension_impl;
    
    template<
        typename T
    >
    struct dimension_impl{
        static const int value = sizeof(T) / sizeof(typename value::type);
    };
}


/**
    ベクトルの次元数を計算します。
    
    使用する為には、vec::value と vec::is_vec の特殊化を行う必要がある