[英]C++: Access class member by member-like method
我有看起来像这样的模板类:
template<int n=3> struct Vec{
double Values[n];
};
当然,我可以直接或通过方法访问此类的元素,例如:
double& x(){
return Values[0];
}
但是,如果我想编写更直观的代码:
Vec<3> v;
v.x() = 5.2;
我想让用户这样做: vx = 5.2
。 不只是一时兴起。 如果我已有使用类似struct{double x,y,z;}
类的简单矢量结构的库,那么我可以通过鸭式输入法创建我的模板类,以在这种情况下有效。 当然,我可以(可能不确定)传递给该库的参照对象预定义结构-例如: struct{double &x=v.Values[0], &y=v.Values[1], &z=v.Values[2];}
但恐怕这不是达成目标的最简单方法。
嗯-当然,我可以在结构中添加引用类型的参数,但这会导致元素大小增加。
这是获得相同语法效果的一种方法:
template<int n=3> struct Vec{
double Values[n];
};
template<int N> struct xyzAdapter;
template<> struct xyzAdapter<3>
{
xyzAdapter(Vec<3>& vec) : x(vec.Values[0]), y(vec.Values[1]), z(vec.Values[2]) {}
double& x;
double& y;
double& z;
};
template<int N> auto make_adapter(Vec<N>& vec)
{
return xyzAdapter<N>(vec);
}
int main()
{
Vec<3> point;
auto adapter = make_adapter(point);
adapter.x = 6;
}
走另一条路并不那么令人愉快。 没有诸如引用数组之类的东西,因此一种解决方法是诉诸于std::reference_wrapper
数组:
#include <tuple>
#include <array>
#include <functional>
#include <iostream>
template<int N = 3> struct Vector;
template<> struct Vector<3>
{
double x, y, z;
auto as_tuple() {
return std::tie(x, y, z);
}
};
template<std::size_t...Is, class Tuple>
auto as_array(std::index_sequence<Is...>, Tuple&& t)
{
return std::array<std::reference_wrapper<double>, sizeof...(Is)> {
std::get<Is>(t)...
};
}
template<int N> auto as_array(Vector<N>& v)
{
return as_array(std::make_index_sequence<N>(), v.as_tuple());
}
int main2()
{
Vector<3> point;
point.x = 6;
auto arr = as_array(point);
for (auto ref : arr) {
std::cout << ref.get() << std::endl;
}
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.