c++ - 在访问 struct 的不同属性的 C++ 函数中重用代码

标签 c++ struct

我有一个结构

struct doodle
{
  int x;
  int y;
};

和 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;
    }
}

我想创建一个函数 ProcessDoodlesGeneric,它可以作为参数信息,说明我对 doodle.x 还是 doodle.y 感兴趣。这可能吗?如果没有,在这个例子中有哪些复用代码的替代方法?

最佳答案

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

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);
}

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

这是 demo .

关于c++ - 在访问 struct 的不同属性的 C++ 函数中重用代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61826715/

相关文章:

c++ - 对齐指针操作

go - 为什么在method中只用一个字符来表示receiver?

将缓冲区转换为结构指针

c++ - 清除/删除 Chromium 嵌入式框架 (CEF3 C++) 缓存

c++ - ostringstream 是未定义的类型?

c++ - 需要在 C++ 中简单演示调用 Delphi DLL

c++ - 对象作为成员变量

c - 将成员地址分配给结构中的其他成员

arrays - 如何在 Swift 3 中获取数组中的结构化数据

c++ - 遍历链表和修改或插入节点C++