使用 fmt 库格式化用户定义类型的问题
Problem with Formatting User-defined Types with fmt library
我在格式化用户定义类型时遇到了问题,最后得到了这个基于 fmt 文档的简单示例。
struct point_double {
double x, y;
operator const char*() const {
return nullptr;
}
};
namespace fmt {
template <>
struct formatter<point_double> {
template <typename ParseContext>
constexpr auto parse(ParseContext& ctx) {
return ctx.begin();
}
template <typename FormatContext>
auto format(const point_double& p, FormatContext& ctx) {
return format_to(ctx.out(), "({:.1f}, {:.1f})", p.x, p.y);
}
};
} // namespace fmt
void foo() {
point_double p = {1, 2};
fmt::print("{}\n", p);
}
调用foo
会崩溃,因为没有使用用户定义的格式化程序。相反 fmt::print
将使用默认的字符串格式化程序并作为运算符 returns nullptr
崩溃。
有没有办法解决这个问题?我正在使用 fmt 5.3.0
您不能同时进行到 const char*
的隐式转换和 formatter
特化({fmt} 现在会给您一个编译时错误),因为 const char*
已经可以格式化.如果您可以控制 point_double
,一个简单的解决方案是使转换运算符显式化,这通常是个好主意。否则,您可以将 point_double
包装在另一种类型中,并为此提供 formatter
专业化。
我在格式化用户定义类型时遇到了问题,最后得到了这个基于 fmt 文档的简单示例。
struct point_double {
double x, y;
operator const char*() const {
return nullptr;
}
};
namespace fmt {
template <>
struct formatter<point_double> {
template <typename ParseContext>
constexpr auto parse(ParseContext& ctx) {
return ctx.begin();
}
template <typename FormatContext>
auto format(const point_double& p, FormatContext& ctx) {
return format_to(ctx.out(), "({:.1f}, {:.1f})", p.x, p.y);
}
};
} // namespace fmt
void foo() {
point_double p = {1, 2};
fmt::print("{}\n", p);
}
调用foo
会崩溃,因为没有使用用户定义的格式化程序。相反 fmt::print
将使用默认的字符串格式化程序并作为运算符 returns nullptr
崩溃。
有没有办法解决这个问题?我正在使用 fmt 5.3.0
您不能同时进行到 const char*
的隐式转换和 formatter
特化({fmt} 现在会给您一个编译时错误),因为 const char*
已经可以格式化.如果您可以控制 point_double
,一个简单的解决方案是使转换运算符显式化,这通常是个好主意。否则,您可以将 point_double
包装在另一种类型中,并为此提供 formatter
专业化。