从参数包到变量参数
From parameter pack to var args
上下文:我处理遗留代码,虽然我想慢慢地使这些代码达到c++14标准,但我仍然坚持使用像printf这样的函数。因此这样的代码(简化):
#include <iostream>
#include <string>
#include <cstdio>
template <typename... Args>
const char* Format(const char* strFormat, Args... args)
{
static char szBuffer[10000];
auto len = std::vsnprintf(szBuffer, 10000, strFormat, args...);
if (len < 0 || 10000 <= len)
{
szBuffer[0] = 0;
}
return szBuffer;
}
int main()
{
auto test = Format("%s %s %d", "test", "test", 42);
}
这奇怪地不起作用:gcc&VS2013无法从扩展参数包转换为va_arg。(http://cpp.sh/4aue)
10:66: error: cannot convert 'const char*' to '__va_list_tag*' for argument '4' to 'int vsnprintf(char*, size_t, const char*, __va_list_tag*)'
为什么会发生这种行为?同时,奇怪的是中间的var_arg函数编译&正常工作(http://cpp.sh/2ggms)。
谢谢
您想要snprintf
,而不是vsnprintf
。参数包展开为逗号分隔的列表。这些函数的v
版本只接受va_list
。
在查看代码示例时,如果您打算传递std::string
,则仍然需要transform_to_c
之类的函数。
相关文章:
- 如何将C++闭包与变量参数同时重用——类似于JavaScript
- 扩展可变参数模板中的变量名称
- 在类构造函数中定义结构变量的参数
- 带有整数的变量参数列表
- 转发变量参数列表以模拟 std::thread
- 如何在不传递命令行参数的情况下在 c++ 中设置环境变量
- 存储稍后要转发的变量参数
- C++具有模板成员变量的类. 和参数内存输出
- 我应该如何在没有变量的情况下将相同的参数传递给 CMAKE 中的多个目标?
- 为变量模板的每个参数调用模板函数
- 具有推导参数的模板函数指针数组变量
- 函数参数变量总是需要 & 或 * 运算符吗?
- 为什么 beginthreadex 线程参数变量在父线程中没有更新
- 在 Metal 着色器代码中,如何定义函数的 in/out 参数变量?
- 如何在函数中使用非参数变量?
- 即将将引用作为函数中的参数传递以更改参数变量的值
- 基于不断变化的参数/变量的XML get值
- cocos2d-x v3 CallFunc作为参数/变量如何
- 在编译时使用c++元编程中的运行时参数(变量)
- 我可以返回一个非参数变量吗?