将任意文本添加到 fmt 的用户定义类型格式化程序

Posted

技术标签:

【中文标题】将任意文本添加到 fmt 的用户定义类型格式化程序【英文标题】:Adding Arbitrary Texts to fmt's User-defined Type Formatter 【发布时间】:2020-08-25 13:14:26 【问题描述】:

我想知道向fmt::formatter::format 添加一些任意文本的正确方法是什么。基本上,我想为我的对象命名。当前的实现有效,但我不确定它是否可以做得更好,而且我觉得我的垂直对齐技巧可以做得更好。

namespace fmt 
  template <>
  struct formatter<Experiment> 
    
    constexpr auto parse(format_parse_context& ctx) 
      return ctx.begin();
    
    
    template <typename FormatContext>
    auto format(const Experiment& e, FormatContext& ctx) 
      ctx.out() = format_to(ctx.out(), "Experiment:\n\t\t\t\t");
      return format_to(ctx.out(),
                       "", join(e.begin(), e.end(), "\n\t\t\t\t"));
    
  ;

【问题讨论】:

【参考方案1】:

您可以通过ctx.out()返回的输出迭代器复制文本:

    template <typename FormatContext>
    auto format(const Experiment& e, FormatContext& ctx) 
      auto out = ctx.out();
      auto text = std::string_view("Experiment:\n\t\t\t\t");
      out = std::copy_n(text.data(), text.size(), out);
      return format_to(out, "", join(e.begin(), e.end(), "\n\t\t\t\t"));
    

请注意,分配给ctx.out() 没有多大意义,因为您分配给一个被丢弃的临时对象。相反,您应该从 format 函数返回过去的迭代器。

关于对齐,如果你知道最大宽度,你可以使用宽度格式说明符进行填充。

【讨论】:

以上是关于将任意文本添加到 fmt 的用户定义类型格式化程序的主要内容,如果未能解决你的问题,请参考以下文章

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

带有外部模板的自定义类型 fmt 格式化程序,有啥缺点吗?

使用 fmt 库格式化用户定义类型的问题

添加自定义类型格式,以及所有常用选项

将用户ip和用户id添加到flask应用程序中的日志文件中

使用 java 应用程序安装添加自定义文件类型