[英]How can I wrap std::format() with my own template function?
注意:这个问题使用 C++20,我使用的是 Visual Studio 2022 (v17.2.2)。
我想创建一个模板函数包装器以允许我使用 std::format 样式日志记录。 包装函数最终会做一些其他与格式无关的东西,这些东西在这里并不重要。
请参阅下面的代码。 请注意, Log1()工作正常,但使用起来感觉很笨拙。 Log2 () 没问题,但使用std::vformat()会丢失对日志格式字符串的编译时检查。
我真正想做的是Log3() 。 问题是 Visual Studio (v17.2.2) 不喜欢这个。
有什么办法可以让它工作(没有宏)?
#include <iostream>
#include <format>
#include <string_view>
// works fine: usage is clunky
auto Log1(std::string_view sv)
{
std::cout << sv;
}
// works, but fmt string is checked at runtime - not compile time
template<typename... Args>
auto Log2(std::string_view fmt, Args&&... args)
{
std::cout << std::vformat(fmt, std::make_format_args(args...));
}
// this doesn't work
template<typename... Args>
auto Log3(std::string_view fmt, Args&&... args)
{
std::cout << std::format(fmt, std::forward<Args>(args)...);
}
int main()
{
Log1(std::format("Hello, {}\n", "world!")); // ok - clunky
Log2("Hello, {}\n", "world!"); // ok - no compile time checking of fmt string
Log2("Hello, {:s}\n", 42); // ok - throws at runtime
Log3("Hello, {}\n", "world!"); // ERROR: doesn't compile
return 0;
}
您需要P2508 (我的论文)才能着陆,它公开了当前仅用于展示的类型std::basic-format-string<charT, Args...>
,这将允许您编写:
template<typename... Args>
auto Log3(std::format_string<Args...> fmt, Args&&... args)
在那之前,你可以调皮一点,使用 MSVC 实现的内部帮助器,理解他们可以在任何时候随意重命名这个类型。
template<typename... Args>
auto Log3(std::_Fmt_string<Args...> fmt, Args&&... args)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.