【问题标题】:Deduce field width from data type in std::format从 std::format 中的数据类型推断字段宽度
【发布时间】:2021-11-29 06:49:34
【问题描述】:

我正在试验新的 C++ 2020 std::format 函数。我想用从其类型推导出的宽度来表示输出。目前我有这条线:

std::wstring wstr = std::format( L"{0:#0{1}x}", ::GetLastError(), sizeof( ::GetLastError() ) * 2 );

这导致值L"0x000002"

  • # 是否应该将0x 计为宽度的一部分? (如果我删除它,我会得到 8 个 nibbles)

  • 有没有更好的方法来制定这个格式字符串,而不需要 sizeof 东西?

【问题讨论】:

    标签: c++ format std c++20


    【解决方案1】:

    # 是否应该将0x 计为宽度的一部分? (如果我删除它,我会得到 8 个 nibbles)

    是的。 [format.string.std]/13 中有一个例子说明了这一点。整个字符串为6个字符,包括0x:

    string s2 = format("{:#06x}", 0xa);     // value of s2 is "0x000a"
    

    这类似于printf 所做的。

    有没有更好的方法来制定这个格式字符串,而不需要 sizeof 东西?

    如果这是您想要经常做的事情,那么您可以创建自己的类型并在内部定义其格式,这样您就可以编写:

    std::wstring wstr = std::format( L"{}", PrettyHex{::GetLastError()});
    

    但这只是在 sizeof 发生的地方移动 - 你仍然需要在某个地方手动提供它,这里没有捷径。

    【讨论】:

    • 谢谢,我认为PrettyHex 不是标准的一部分,而是我应该定义的东西。你能给出一些从哪里开始的方向吗?这是某物或模板的子类,还是什么?
    • @z32a7ul 是的,这就是为什么介绍它的句子说“您可以创建自己的类型并定义其格式”。它不是任何东西的子类。它只是一种类型,它的存在只是为了以您想要的方式格式化::GetLastError()
    • 好的,我研究过创建这样的类型,但不值得。
    【解决方案2】:

    不管怎样,我写了这个专业。所以如果有人感兴趣,这里是:

    #include <format>
    #include <iostream>
    
    typedef unsigned long DWORD;
    
    struct PrettyHex {
        DWORD dwValue;
    };
    
    template<>
    struct std::formatter< PrettyHex, wchar_t > : std::formatter< std::wstring, wchar_t > {
        auto format( PrettyHex prettyHex, std::wformat_context& context ) {
            std::wstring wstrPrettyHex = std::format( L"0x{:0{}x}", prettyHex.dwValue, sizeof prettyHex.dwValue * 2 );
            return std::formatter< std::wstring, wchar_t >::format( wstrPrettyHex, context );
        }
    };
    
    int wmain() {
        DWORD dwTest = 102;
        std::wstring wstrTest = std::format( L"dwTest formatted as DWORD: {}\ndwTest formatted as PrettyHex: {}\n", dwTest, PrettyHex{ dwTest } );
        std::wcout << wstrTest;
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-05
      • 1970-01-01
      • 2014-05-08
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多