假设我们有以下数据结构:
enum Color{
Red,
Blue,
Black,
White
};
struct Car{
char* model;
enum Color color;
double engineCapacity;
};
struct Cars{
struct Car *garage;
size_t count;
};
有两个函数可以在类型列表中查找具有匹配字段的元素color
:engineCapacity
Cars
struct Car *findByColor(struct Cars cars, enum Color color){
while(cars.count-- > 0){
if (cars.garage->color == color){
return cars.garage;
}
cars.garage++;
}
return NULL;
}
struct Car *findByEngineCapacity(struct Cars cars, double engineCapacity){
while(cars.count-- > 0){
if (cars.garage->engineCapacity == engineCapacity){
return cars.garage;
}
cars.garage++;
}
return NULL;
}
可以看出,功能几乎是相互重复的。你能告诉我在这种情况下如何避免代码重复吗?
我们实现了一个类似于算法的自行车
::std::find_if
:保持与手动编码搜索功能的每个变体相同的效率的一种方法是使用宏。
您将需要几个宏来实现您的程序。一个用于生成函数的名称和代码,另一个用于表示搜索参数与结构字段的比较
Car
(如果您只管理运算符==
以合适方式工作的字段,则可以省略) .如果您打算将搜索函数的代码放在一个单独的文件中,您还需要一个生成函数原型的宏。
使用字段名称和搜索参数类型调用代码生成宏将为该特定字段生成搜索代码(这类似于在 C++ 中使用模板)。
以这种方式创建的函数的调用方式与在问题文本中的调用方式相同,即 具有与字段类型相对应的搜索参数。
这是 3 个文件的示例(为了显示一般情况)。
头文件定义数据结构和宏:
这是具有按型号名称查找汽车的功能的文件可能看起来的样子
现在具有 main() 和按颜色和 engineCapacity 搜索功能的文件
如果您有任何问题,请随时在评论中提问。
谢谢@VTT,有点想通了。