vec::pointer
ベクトルの先頭配列のポインタを返します。
#include#include "vec/vec.hpp" #include "vec/extension/pointer.hpp" #include "vec/extension/dimension.hpp" namespace vec = kmt_ex::math::vec; typedef vec::vec<3, float> vec3; int main(){ vec3 v; // 配列による、要素へのアクセス (v|vec::pointer)[0] = 54.8f; (v|vec::pointer)[1] = 0.72f; (v|vec::pointer)[2] = 94.01f; // 値を出力 for( int i = 0 ; i < (v|vec::dimension_) ; i++ ){ std::cout << (v|vec::pointer)[i] << "\n"; } return 0; }
先頭配列のポインタを返す事を保障するので配列のように扱う事が出来ます。
コレを使って各要素へのアクセスを行います。
namespace kmt_ex{ namespace math{ namespace vec{ namespace extension{ template< typename vec_t > struct pointer_impl{ typedef vec_t vec_t; template< typename vec_t > struct result{ typedef typename value::type* type; }; typename result ::type operator ()(vec_t& v) const{ return reinterpret_cast ::type>(&v); } }; template< int D, typename T > struct pointer_impl< vec >{ typedef vec vec_t; template< typename vec_t > struct result{ typedef typename value ::type* type; }; typename result ::type operator ()(vec_t& v) const{ return v.value; } }; struct pointer_t{ template< typename vec_t > struct result{ typedef typename value ::type* type; }; template< typename vec_t > typename result ::type operator()(vec_t& v) const{ return pointer_impl ()(v); } }; /** 要素の型にキャストして値を返す。 例) vec::vec<3, float> 型ならば、 float* として、キャストを行う また、配列によるアクセスを行うので(vec::at等が) 先頭ポインタである事を保障しなければなりません。 */ static const pointer_t pointer; } using extension::pointer; } } } // namespace kmt_ex{ namespace math{ namespace vec{
基本的にポインタのキャストを行ってるだけです、
独自ベクトル型で特殊な事をしたい場合は、
クラステンプレートの特殊化を行う必要があります。