重用 C++ 函数中访问结构体不同属性的代码

A B*_*A B 3 c++ struct

我有一个结构

struct doodle
{
  int x;
  int y;
};
Run Code Online (Sandbox Code Playgroud)

和 2 个相同的方法,除了它们使用 的不同属性struct doodle

void ProcessDoodlesHorizontally(std::vector<struct doodle>& v_doodles)
{
    for (unsigned int i=0; i<v_doodles.size(); i++)
    {
      int x = v_doodles.at(i).x;
      std::cout<<x<<std::endl;
    }
}

void ProcessDoodlesVertically(std::vector<struct doodle>& v_doodles)
{
    for (unsigned int i=0; i<v_doodles.size(); i++)
    {
      int y = v_doodles.at(i).y;
      std::cout<<y<<std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想创建一个函数ProcessDoodlesGeneric,该函数可以将有关我对 doodle.x 还是 doodle.y 感兴趣的参数信息作为参数。这可能吗?如果不是,那么在此示例中重用代码的替代方法是什么?

cig*_*ien 5

由于函数之间的唯一区别是使用哪个数据成员,您可以传入一个指向数据成员的指针(这在这里有效,因为两个数据成员的类型相同):

void Process(std::vector<struct doodle>& v_doodles, int doodle::* field)
{
  for (auto &doodle : v_doodles)
      std::cout<< doodle.*field << std::endl;
}

void ProcessDoodlesHorizontally(std::vector<struct doodle>& v_doodles)
{
  Process(v_doodles, &doodle::x);
}

void ProcessDoodlesVertically(std::vector<struct doodle>& v_doodles)
{
  Process(v_doodles, &doodle::y);
}
Run Code Online (Sandbox Code Playgroud)

请注意,我稍微清理了 for 循环以使其更易于阅读。

这是一个演示