带有 fmt 的自定义格式说明符用于自定义类

Posted

技术标签:

【中文标题】带有 fmt 的自定义格式说明符用于自定义类【英文标题】:Custom format specifier with fmt for custom class带有 fmt 的自定义格式说明符用于自定义类 【发布时间】:2019-10-04 03:42:35 【问题描述】:

在格式化我自己的自定义类型时,我将如何允许自定义填充等?

struct S

   int x;
;

template<> struct fmt::formatter<S> 
    template <typename ParseContext>
        constexpr auto parse(ParseContext& ctx)  return ctx.begin(); 

    template <typename FormatContext>
        auto format(const S& s, FormatContext& ctx)
        
            return format_to(ctx.out(), "", s.x);
        
;

S s; s.x = 1;
fmt::format(":<10", s); // error

【问题讨论】:

【参考方案1】:

由于您似乎只重用现有的格式说明符,您可以将操作转发到formatter&lt;int&gt;

template<> struct fmt::formatter<S> 
    formatter<int> int_formatter;

    template <typename ParseContext>
        constexpr auto parse(ParseContext& ctx)
        
            return int_formatter.parse(ctx);
        

    template <typename FormatContext>
        auto format(const S& s, FormatContext& ctx)
        
            return int_formatter.format(s.x, ctx);
        
;

如果你想使用不同的语法,或者你不想依赖formatter&lt;int&gt;,你也可以手动解析formatter::parse中的格式字符串。

template<> struct fmt::formatter<S> 
    enum  left, right  align = right;
    int width = 0;

    template <typename ParseContext>
        constexpr auto parse(ParseContext& ctx)
        
            auto it = ctx.begin();

            // parse /align/
            if (*it == '<') 
                align = left;
                ++it;
            

            // parse /width/
            const char* width_str_begin = std::to_address(it);
            const char* width_str_bound = std::to_address(ctx.end());
            auto [ptr, ec] = std::from_chars(width_str_begin, width_str_bound, width);
            auto length = ptr - width_str_begin;
            it += length;

            // error handling omitted

            return it;
        

    template <typename FormatContext>
        auto format(const S& s, FormatContext& ctx)
        
            return format_to(ctx.out(), align == left ? ":<" : ":>", s.x, width);
        
;

【讨论】:

以上是关于带有 fmt 的自定义格式说明符用于自定义类的主要内容,如果未能解决你的问题,请参考以下文章

带有编译时格式字符串检查的自定义 fmt 格式化函数

js时间类型的自定义转换库 datetime-fmt

如何将自定义格式说明符添加到 fmt

FMT C++ 库:允许用户为自定义类型设置格式说明符

用于问题跟踪的 Github Slack 集成的自定义消息

Apps 脚本:带有文本的自定义数字格式