将任意文本添加到 fmt 的 User-defined 类型格式化程序
Adding Arbitrary Texts to fmt's User-defined Type Formatter
我想知道向 fmt::formatter::format
添加一些任意文本的正确方法是什么。基本上,我想为我的 object 取一个标题。当前的实现有效,但我不确定是否可以做得更好,而且我觉得我的垂直对齐 hack 可以做得更好。
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"));
}
};
}
您可以通过输出迭代器复制文本 returned by 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()
没有多大意义,因为您正在分配给一个被丢弃的临时文件。相反,您应该 return 来自 format
函数的尾后迭代器。
关于对齐,如果知道最大宽度,可以使用宽度格式说明符进行填充。
我想知道向 fmt::formatter::format
添加一些任意文本的正确方法是什么。基本上,我想为我的 object 取一个标题。当前的实现有效,但我不确定是否可以做得更好,而且我觉得我的垂直对齐 hack 可以做得更好。
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"));
}
};
}
您可以通过输出迭代器复制文本 returned by 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()
没有多大意义,因为您正在分配给一个被丢弃的临时文件。相反,您应该 return 来自 format
函数的尾后迭代器。
关于对齐,如果知道最大宽度,可以使用宽度格式说明符进行填充。