用可变参数喂 boost::format

Feeding boost::format with variadic parameters

我正在尝试编写一个日志记录函数,它采用可变参数列表并在安全庄园中打印。
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项目)。我只是建议了这些库,因为它们似乎是最有希望实现上述所有目标的库。

谢谢!

您可以使用支持旧编译器的 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 *)

FMT_VARIADIC 生成的 loggerFunc 可以与可变数量的参数一起使用:

loggerFunc("{} {} {} {}", 1, "Test", 3.4, "OtherString");

免责声明:我是 fmt 库的作者。