繁体   English   中英

C ++:通过类成员方法访问类成员

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM