Sco*_*ott 4 c c++ parameters optional-parameters
我正在使用C++重写C程序以利用OO方面,因此它可以轻松支持多个设备,并且程序的一部分是表达式评估程序.表达式可以有函数调用,这里是函数的结构.
typedef struct {
char *name;
int argc;
void (*func) ();
} FUNCTION;
Run Code Online (Sandbox Code Playgroud)
不知何故,func可以通过它传递可变数量的参数.
RESULT *param[10];
if (Root->Function->argc < 0) {
/* Function with variable argument list: */
/* pass number of arguments as first parameter */
Root->Function->func(Root->Result, argc, ¶m);
} else {
Root->Function->func(Root->Result, param[0], param[1], param[2], param[3], param[4], param[5], param[6],
param[7], param[8], param[9]);
}
Run Code Online (Sandbox Code Playgroud)
老实说,我甚至不确定如何在C中做到这一点.解释会非常好.可以用C++完成吗?
该变参是你在找什么.它适用于C和C++.这就是printf()用于例如:)的内容.
您可以通过googling va_arg(用于可变数量参数的函数之一)找到更多信息
其实我会反对这里的每一个人,以及你的愿望.
省略号是错误的.它被认为是C中不可或缺的,但从那以后我们学到了更好的东西.
实际上,有些方法可以在C++中实现更好,使用对象,例如函数对象.
您正在寻找的是命令模式.
创建一个名为'Command'的基类(带有execute()方法的接口),然后为你想要放入'void(*func)()'的每个'函数'创建一个派生类.
现在,您的代码将如下所示:
std::vector<RESULT*> param(10, NULL);
if (Root->Function->argc < 0) {
/* Function with variable argument list: */
/* pass number of arguments as first parameter */
Command1* aCommand = new Command1(Root->Result);
aCommand->set(Root->Result, argc, ¶m);
Root->Function->command = aCommand;
Root->Function->command->execute();
} else {
Command2* aCommand = new Command2(Root->Result);
aCommand->set(Root->Result, param[0], param[1], param[2], param[3], param[4], param[5], param[6], param[7], param[8], param[9]);
Root->Function->command = aCommand;
Root->Function->command->execute();
}
Run Code Online (Sandbox Code Playgroud)
在这里,您不需要省略号,因为每个命令对象都是专用的,并且确切地知道它需要什么参数(数量和类型).
命令模式允许您获得"..."(省略号)的所有好处而不会带来不便.当然有些人会说这是一个时间的浪费,因为他们不会犯错误,所以他们不需要输入更多...不幸的是我不是那么聪明所以我更喜欢定义约束(数量,类型) ,断言)并让编译器为我强制执行它们.
| 归档时间: |
|
| 查看次数: |
4055 次 |
| 最近记录: |