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 の特殊化を行う必要がある