用可变参数喂 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 库的作者。
我正在尝试编写一个日志记录函数,它采用可变参数列表并在安全庄园中打印。
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 库的作者。