我正在尝试编写一个日志函数,它采用可变参数列表并在安全庄园中打印。
vprintf
似乎是显而易见的答案,但是当格式字符串期望的参数比提供的参数多时,我似乎找不到一种安全的方法来处理。
此外,如果我可以重新排列参数的打印顺序,那就太好了。
这第二个要求导致我boost::format
,这似乎正是我想要的,除了它不接受va_list
输入。
我做了一些广泛的搜索,我能得到的最接近的是这个解决方案:
boost::format with variadic template arguments
不幸的是,我仅限于特定的 gcc 版本,它似乎不包括std::initializer_list
在我的搜索中,我偶然发现boost::preprocessor
它似乎应该能够完成我想要的,但我正在努力实现它。
所以,理想情况下,我正在寻找的是如下工作的东西:
void loggerFunc(const char* msgFormat, ...){
boost::format f(msgFormat);
va_list args;
va_start(args, msg);
f & MagicalFunctionCall(args);
va_end(args);
}
这MagicalFunctionCall(args)
会将我的参数转换为:例如
1, "Test", 3.4, "OtherString"
:
1 & "Test" & 3.4 & "OtherString"
我不一定与boost::preprocessor
任何东西相关联boost
,但在不引入任何额外的第 3 方依赖项的情况下完成此操作将是理想的(我们已经在项目的其他地方使用了 boost)。我只是推荐了这些库,因为它们似乎是完成上述所有工作的最有希望的。
谢谢!