1

我想知道将一些任意文本添加到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"));
    }
  };
}
4

1 回答 1

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

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

于 2021-03-10T14:03:37.803 回答