假设我们有以下参数来描述一个人:name(字符串)和age(无符号整型).我想编写一个通用的setter API函数,人们可以调用该函数来设置特定人员的姓名或年龄.原因将在下面解释.
我所做的是定义Person参数名称的枚举类型:
typedef enum person_param_name
{
NAME,
AGE,
} person_param_name_t;
也是Person参数值的联合类型:
typedef union person_param_val
{
char* name;
unsigned int age;
} person_param_val_t;
现在,该函数如下所示:
int set_person_param(person_param_name_t param_name, person_param_val_t param_val)
{
int ret = 0;
switch (param_name)
{
case NAME:
g_person_name = param_val.name;
break;
case AGE:
g_person_age = param_val.age;
break;
default:
ret = -1;
break;
}
return ret;
}
这种方法的问题是不能像这样简单地调用setter函数(编译器抛出警告):
set_person_param(NAME, "Alex");
set_person_param(AGE, 5);
但它们必须将参数值显式转换为person_param_val_t
类型,如下所示:
set_person_param(NAME, (person_param_val_t)"Alex");
set_person_param(AGE, (person_param_val_t )5);
我之所以想要通用的setter函数,是因为在实际的程序中,我有更多的参数(接近100),并且我需要编写许多(非常类似的)setter函数,这将需要更多的代码行.
有没有更好的方法来解决这个问题?