c++ - 如何在不传递参数数量且仅使用 3 个点的情况下使用可变参数函数?
问题描述
考虑下面的代码,是否可以在不获取参数数量的情况下定义可变参数函数?
void printFunction(...)
{
int noOfArgs = "Any way to get number of arguments?";
va_list args;
va_start(args, noOfArgs);
cout << va_arg(args, int) << endl;
for (int i = 2; i <= noOfArgs; i++)
{
cout << va_arg(args, int) << endl;
}
va_end(args);
}
int main()
{
printFunction(1, 2, 3, 4, 5);
return 0;
}
解决方案
在 C 中获取参数的数量是不可能的va_args
。你能做的最好的事情是使用一个结束序列的魔法值和一个宏来对你的用户隐藏它:
#define printFunction(...) actualPrintFunction(__VA_ARGS__, 42)
void actualPrintFunction(int first, ...)
{
va_list args;
va_start(args, first);
int arg;
std::cout << first << endl;
while((arg = va_arg(args, int)) != 42)
{
cout << arg << endl;
}
va_end(args);
}
如评论中所述,您也可以使用 C++ 折叠表达式。上面的优点是与 C 兼容,编译速度更快,而 C++ 方法为您提供类型安全。
推荐阅读
- excel - 将变量除以给出假零结果
- javascript - 如何将事件监听器绑定到特定的 div 元素?
- jquery - 使用 jquery更改 SVG标签
- javascript - Ajax 不刷新联系表单(PHP 和 Bootstrap 4)
- javascript - 如何自动检测具有相同类名的当前表单元素
- c# - 构建错误 - Roslyn MSB3883:意外异常: System.Security.Principal.Windows 的 System.IO.FileNotFoundException
- python - Python shutil.copytree 说它应该复制的目标文件丢失
- reactjs - 语义用户界面反应选择表格单元格不起作用
- vue.js - 使用 vuex 和 vue-router 时未定义的数据
- r - R:动态调整输出pdf大小以绘制函数内的区域