我有一个结构
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 感兴趣的参数信息作为参数。这可能吗?如果不是,那么在此示例中重用代码的替代方法是什么?
由于函数之间的唯一区别是使用哪个数据成员,您可以传入一个指向数据成员的指针(这在这里有效,因为两个数据成员的类型相同):
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 循环以使其更易于阅读。
这是一个演示。