带有外部模板的自定义类型 {fmt} 格式化程序,有什么缺点吗?
Custom type {fmt} formatters with external termplates, any drawbacks?
我有一个 header 为我的自定义类型定义所有 {fmt} 格式化程序。
为了缩短编译时间,我想减少此自定义格式化程序的依赖性 header,并决定将所有格式化程序定义为外部模板,其中实现放在 .cpp
中,其中header 文件中的声明如下:
template<>
struct formatter<MyType> : formatter<std::string>
{
auto format(const MyType& t, format_context& ctx);
};
extern template struct formatter<MyType>;
...以及 .cpp
文件中的定义:
auto formatter<MyType>::format(const MyType& t, format_context& ctx)
{
return format_to(ctx.out, "MyType: {}", ...);
}
主要优点是 header 文件变得不那么重,所有自定义类型都可以向前声明,我不再包括世界,以防我想在某些文件中使用单个类型的自定义格式翻译单元。
然而,大多数关于使用 {fmt} 实现自定义格式化程序的示例将 format()
函数定义为在 format_context
类型上模板化的模板函数:
template<typename FormatContext>
auto format(const MyType& t, FormatContext& ctx);
这实际上不适用于外部模板,因为我需要预先为所有可能的 FormatContext
类型声明 format()
。这是容易出错的。目前,仅使用 fmt::format_context
有效,编译器会在它不再足够时告诉我。
我想知道没有在 FormatContext
类型上模板化格式函数会损失什么?在什么情况下 fmt::format_context
是不够的?有没有更好的方法来定义这些自定义类型格式化程序,而不必将完整的实现放在 header 文件中?我正在考虑走 std::ostream
路线,然后在我想用 {fmt} 格式化我的类型时简单地包括 <fmt/ostream.h>
,但它部分地违背了首先使用 {fmt} 的目的.
what I loose by not having a format function templatized on the FormatContext type?
您将无法通过输出迭代器进行格式化。
以前这意味着您将无法使用
format_to[_n]
。但是在当前 master
这个限制有
已被删除并且 format_to
和 format_to_n
都可以使用
format_context
。现在只有格式化字符串
编译 可能需要
自定义输出迭代器。
我有一个 header 为我的自定义类型定义所有 {fmt} 格式化程序。
为了缩短编译时间,我想减少此自定义格式化程序的依赖性 header,并决定将所有格式化程序定义为外部模板,其中实现放在 .cpp
中,其中header 文件中的声明如下:
template<>
struct formatter<MyType> : formatter<std::string>
{
auto format(const MyType& t, format_context& ctx);
};
extern template struct formatter<MyType>;
...以及 .cpp
文件中的定义:
auto formatter<MyType>::format(const MyType& t, format_context& ctx)
{
return format_to(ctx.out, "MyType: {}", ...);
}
主要优点是 header 文件变得不那么重,所有自定义类型都可以向前声明,我不再包括世界,以防我想在某些文件中使用单个类型的自定义格式翻译单元。
然而,大多数关于使用 {fmt} 实现自定义格式化程序的示例将 format()
函数定义为在 format_context
类型上模板化的模板函数:
template<typename FormatContext>
auto format(const MyType& t, FormatContext& ctx);
这实际上不适用于外部模板,因为我需要预先为所有可能的 FormatContext
类型声明 format()
。这是容易出错的。目前,仅使用 fmt::format_context
有效,编译器会在它不再足够时告诉我。
我想知道没有在 FormatContext
类型上模板化格式函数会损失什么?在什么情况下 fmt::format_context
是不够的?有没有更好的方法来定义这些自定义类型格式化程序,而不必将完整的实现放在 header 文件中?我正在考虑走 std::ostream
路线,然后在我想用 {fmt} 格式化我的类型时简单地包括 <fmt/ostream.h>
,但它部分地违背了首先使用 {fmt} 的目的.
what I loose by not having a format function templatized on the FormatContext type?
您将无法通过输出迭代器进行格式化。
以前这意味着您将无法使用
format_to[_n]
。但是在当前 master
这个限制有
已被删除并且 format_to
和 format_to_n
都可以使用
format_context
。现在只有格式化字符串
编译 可能需要
自定义输出迭代器。