如何解决如何将可变参数函数参数传递给 C++ 中的另一个函数特别是 std::format?
我正在尝试编写一个记录器,它可以像 printf
那样接受参数并支持格式。我打算只对记录器的输入调用 std::format
,但我需要将可变参数参数转发到 std::format
。我该怎么做?
我也想要它的样子:
void log(const std::string& msg)
{
std::cout << msg << std::endl; // I'm actually wrapping another logger here,this is just an example.
}
void log(const std::string& fmt_string ...);
{
std::string msg = std::format(gmt_string,...);
log(msg);
}
解决方法
您不想要 C 风格的 ...
参数。你想要一个可变参数模板:
template <typename T,typename ...P>
void log(T &&format,P &&... params)
{
std::string msg = fmt::format(std::forward<T>(format),std::forward<P>(params)...);
std::cout << msg << '\n';
}
注意转发参数的引用,pack 而不是 const 引用。 Const 引用以前给我带来了问题(spdlog 以前使用的是 const 引用,而 fmt::join
不喜欢它们)。
注意第一个参数被模板化。至少对于 libfmt,这是能够接收 FMT_STRING(...)
参数所必需的。对于 std::format
,std::string_view
可能就足够了。 const std::string &
不酷,因为它强制进行堆分配。
另外,我不确定我对单独的无参数重载有什么感觉。这意味着您必须在至少有一个参数时转义 {
和 }
,这并不好。
也可以考虑使用spdlog,非常相似。它封装了 libfmt,可以直接输出到各种/任意目标。
,您需要使用 template parameter pack 和 std::forward
,例如:
template <class... Args>
void log(const std::string& fmt_string,Args&&... args)
{
std::string msg = std::format(fmt_string,std::forward<Args>(args)...);
log(msg);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。