ベクトルの要素へのアクセス 〜その5〜

[ベクトル型の例]

boost::array<float, 3>    array_vec;
std::valarray<float>      valarray_vec;

struct my_vec{
    float x, y, z;
};

0.各アクセッサを使用するために最低限必要な実装

x, y, z の要素の型を取得すために vec_value の特殊化を行います。


[使用例]

my_vec vec;

vec_value<my_vec>::type x = vec.x;

vec_value<my_vec>::type
get_x(my_vec& vec){
    return vec.x;
}


[実装例]

template<typename T, std::size_t N>
struct vec_value<boost::array<T, N> >{
    typedef T type;
};

template<typename T>
struct vec_value<std::valarray<T> >{
    typedef T type;
};

template<>
struct vec_value<my_vec>{
    typedef float type;
};

1.イテレータによるアクセス

[使用例]

boost::array<float, 3>    array_vec;
for( vec_iterator<boost::array<float, 3> >::type it = begin(array_vec) ;
     it != end(array_vec) ;
     it++){
    *it = 0;
}


[実装例]

template<typename T, std::size_t N>
struct vec_iterator<boost::array<T, N> >{
    typedef typename boost::array<T, N>::iterator type;
};

template<typename T, std::size_t N>
typename vec_iterator<boost::array<T, N> >::type
begin(boost::array<T, N>& vec){
    return vec.begin();
}

template<typename T, std::size_t N>
typename vec_iterator<boost::array<T, N> >::type
end(boost::array<T, N>& vec){
    return vec.end();
}


[他のアクセス方法]

boost::array<float, 3>    array_vec;

at(array_vec, 0) = get_x(array_vec);
at(array_vec, 1) = get_y(array_vec);
at(array_vec, 2) = get_z(array_vec);

2.インデックスでアクセス

[使用例]

std::valarray<float>    valarray_vec(3);

at(valarray_vec, 0) = 0.0f;
at(valarray_vec, 1) = 0.0f;
at(valarray_vec, 2) = 0.0f;


[実装例]

template<typename T>
T&
at(std::valarray<T>& vec, std::size_t index){
    return vec[index];
}


[他のアクセス方法]

std::valarray<float>    valarray_vec(3);

at(valarray_vec, 0) = 0.0f;
at(valarray_vec, 1) = 0.0f;
at(valarray_vec, 2) = 0.0f;

3.要素へ直接アクセス

[使用例]

my_vec vec;

set_x(vec, 0.0f);
set_y(vec, 0.0f);
set_z(vec, 0.0f);


[実装例]

void
set_x(my_vec& vec, float value){
    vec.x = value;
}
float
get_x(my_vec& vec){
    return vec.x;
}

void
set_y(my_vec& vec, float value){
    vec.y = value;
}
float
get_y(my_vec& vec){
    return vec.y;
}

void
set_z(my_vec& vec, float value){
    vec.z = value;
}
float
get_z(my_vec& vec){
    return vec.z;
}


[他のアクセス方法]

// なし