【发布时间】:2014-11-04 13:31:00
【问题描述】:
我想使用可变参数模板来帮助解决使用 va-args 的问题。基本上,我想调用一个单数函数,将“命令”连同参数的变量列表传递给函数,然后将参数分派给另一个函数。
我已经使用经过验证的真实(但不是类型安全)va_list 实现了这一点。这是我使用可变参数模板进行的尝试。下面的示例无法编译,因为您很快就会发现原因...
#include <iostream>
using namespace std;
typedef enum cmd_t
{
CMD_ZERO,
CMD_ONE,
CMD_TWO,
} COMMANDS;
int cmd0(double a, double b, double c)
{
cout << "cmd0 " << a << ", " << b << ", " << c << endl;
return 0;
}
int cmd1(int a, int b, int c)
{
cout << "cmd1 " << a << ", " << b << ", " << c << endl;
return 1;
}
template<typename... Args>
int DispatchCommand(COMMANDS cmd, Args... args)
{
int stat = 0;
switch (cmd)
{
case CMD_ZERO:
cmd0(args...);
break;
case CMD_ONE:
cmd1(args...);
break;
default:
stat = -1;
break;
}
return stat;
}
int main()
{
int stat;
stat = DispatchCommand(CMD_ZERO, 1, 3.141, 4);
stat = DispatchCommand(CMD_ONE, 5, 6, 7);
stat = DispatchCommand(CMD_TWO, 5, 6, 7, 8, 9);
system("pause");
return 0;
}
有人知道如何修改此函数以正确使用可变参数模板吗?
【问题讨论】:
-
为什么不使用普通的旧函数重载?定义一个函数
DispatchCommand,它接受4个参数,重载一个接受5个参数的函数,以此类推。 -
在编译时是否知道
COMMANDS cmd? -
也许这会有所帮助:stackoverflow.com/a/25264850
-
@Jarod42:必须提供正确的参数类型。因此,这个问题毫无意义。他试图“忘记”他将要使用哪个函数,然后再次推演,却无法正确推演。解决方案是首先不要忘记签名。
-
@Jarod40 - 是的,COMMANDS 枚举在编译时是已知的