我正在尝试编写一个记录函数,该函数采用可变参数列表并以安全的方式打印
boost::format
似乎是一个明显的答案,但是当格式字符串需要比提供的更多参数时,我似乎无法找到一种安全的方法来处理。
此外,如果我可以重新排列参数的打印顺序,那将是非常好的
第二个要求导致我va_list
,这似乎正是我想要的,除了它不接受std::initializer_list
输入。
我做了一些广泛的搜索,我能得到的最接近的是这个解决方案:
boost::format with variadic template arguments
不幸的是,我受限于特定的gcc版本,似乎不包含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"
会转换我的args,例如:
1 & "Test" & 3.4 & "OtherString"
变成这样的东西:
boost::preprocessor
我不一定真的与boost
或任何itertools.groupby
绑定,但如果不引入任何其他第三方依赖项(我们已经在项目的其他地方使用了boost),这将是理想的。 。我只是建议那些库,因为它们似乎是完成上述所有工作的最有希望的。
谢谢!
答案 0 :(得分:1)
您可以使用支持较旧编译器的fmt library代替Boost格式:
void loggerFunc(const char *format, fmt::ArgList args) {
std::string s = fmt::format(format, args);
// log s
}
FMT_VARIADIC(void, loggerFunc, const char *)
loggerFunc
生成的FMT_VARIADIC
可以与可变数量的参数一起使用:
loggerFunc("{} {} {} {}", 1, "Test", 3.4, "OtherString");
免责声明:我是fmt库的作者。