繁体   English   中英

如何用我自己的模板函数包装 std::format() ?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM