使用可变参数提供boost :: format

时间:2018-02-13 20:35:43

标签: c++11 variadic-macros boost-preprocessor boost-format gcc4.4

我正在尝试编写一个记录函数,该函数采用可变参数列表并以安全的方式打印 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),这将是理想的。 。我只是建议那些库,因为它们似乎是完成上述所有工作的最有希望的。

谢谢!

1 个答案:

答案 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库的作者。