メンバ変数のアドレスを template に渡す

#include <iostream>

template<
    typename class_t,
    typename type,
    type class_t::*member_ptr
>
struct member{
    typedef type result_t;
    result_t&
    operator ()(class_t& rhs) const{
        return rhs.*member_ptr;
    }
};

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

member<vec_t, float, &vec_t::x>    at_x;
member<vec_t, float, &vec_t::y>    at_y;
member<vec_t, float, &vec_t::z>    at_z;

int
main(){
    vec_t    vec;
    
    at_x(vec) = 0.0f;
    at_y(vec) = 1.0f;
    at_z(vec) = 2.0f;

    std::cout << at_x(vec) << ", " << at_y(vec) << ", " << at_z(vec) << std::endl;

    return 0;
}


[出力]

0, 1, 2


にゃんと!こんな事も出来るのか…。