1

我正在尝试编写一个日志函数,它采用可变参数列表并在安全庄园中打印。
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)。我只是推荐了这些库,因为它们似乎是完成上述所有工作的最有希望的。

谢谢!

4

1 回答 1

1

您可以使用支持旧编译器的fmt 库来代替 Boost Format :

void loggerFunc(const char *format, fmt::ArgList args) {
  std::string s = fmt::format(format, args);
  // log s
}
FMT_VARIADIC(void, loggerFunc, const char *)

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

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

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

于 2018-02-14T15:18:30.210 回答