C++ fmt::print 与 fmt::format_to 命名的技术背景?
Technical background to the C++ fmt::print vs. fmt::format_to naming?
为什么是fmt::format_to(OutputIt, ...)
而不是fmt::print(OutputIt, ...)
??
我目前正在熟悉 {fmt}
,一个现代 C++ 格式化库。
在浏览 API 时,我发现命名有点不连贯,但考虑到我对图书馆的 little-to-no 经验(以及我对 API 设计的兴趣),我想支持这些命名选择:(fmt core API reference)
- 有
fmt::format(...) -> std::string
是有道理的,它 return 是一个格式化的字符串。
- 然后我们有
void fmt::print([stream, ] ...)
,这在命名方面也很有意义(当然考虑到 printf
遗产)。
- 但是 然后 我们有
fmt::format_to(OutputIt, ...) -> OutputIt
除了 return 类型之外,它类似于 print
对流的作用。
现在很明显,一个人可以整天骑车改名字,但这里的问题是 而不是 为什么我们有 format
与 print
(哪个对我来说很容易解释),但是为什么一个明显(?)表现得像 write-to-stream-kind 的函数与 format_...
命名风格捆绑在一起。
因此,正如问题标题已经提出的那样,格式化为流时 fmt::print(stream, ...)
的行为与 fmt::format_to(OutputIt, ...)
的行为是否存在 技术差异格式化为输出迭代器时的行为?
或者was/is这纯粹是风格的选择?另外,考虑到这里的 GitHube repo explicitly lists the fmt 标签,我希望我们能从原 API 作者那里得到权威的答案。
虽然可以命名为 format_to
print
,但前者在概念上更接近 format
而不是 print
。 format_to
是 format
的推广,它通过输出迭代器而不是 std::string
写入输出。因此命名反映了这一点。
另一方面,没有流参数的 print
写入 stdout
并且带有参数的 print
将其概括为任意流。写入流与写入输出迭代器根本不同,因为它涉及额外的缓冲、同步等。其他语言通常使用“打印”来实现此类功能,因此在 {fmt} 中遵循此约定。
这变得模糊,因为您可以有一个写入流的输出迭代器,但即使在那里,当前的命名也反映了正在使用的高级 API。
换句话说,format_to
基本上是一个奇特的 STL 算法(甚至 format_to_n
类似于 copy
/copy_n
),而 print
是一个格式化输出函数。
为什么是fmt::format_to(OutputIt, ...)
而不是fmt::print(OutputIt, ...)
??
我目前正在熟悉 {fmt}
,一个现代 C++ 格式化库。
在浏览 API 时,我发现命名有点不连贯,但考虑到我对图书馆的 little-to-no 经验(以及我对 API 设计的兴趣),我想支持这些命名选择:(fmt core API reference)
- 有
fmt::format(...) -> std::string
是有道理的,它 return 是一个格式化的字符串。 - 然后我们有
void fmt::print([stream, ] ...)
,这在命名方面也很有意义(当然考虑到printf
遗产)。 - 但是 然后 我们有
fmt::format_to(OutputIt, ...) -> OutputIt
除了 return 类型之外,它类似于print
对流的作用。
现在很明显,一个人可以整天骑车改名字,但这里的问题是 而不是 为什么我们有 format
与 print
(哪个对我来说很容易解释),但是为什么一个明显(?)表现得像 write-to-stream-kind 的函数与 format_...
命名风格捆绑在一起。
因此,正如问题标题已经提出的那样,格式化为流时 fmt::print(stream, ...)
的行为与 fmt::format_to(OutputIt, ...)
的行为是否存在 技术差异格式化为输出迭代器时的行为?
或者was/is这纯粹是风格的选择?另外,考虑到这里的 GitHube repo explicitly lists the fmt 标签,我希望我们能从原 API 作者那里得到权威的答案。
虽然可以命名为 format_to
print
,但前者在概念上更接近 format
而不是 print
。 format_to
是 format
的推广,它通过输出迭代器而不是 std::string
写入输出。因此命名反映了这一点。
print
写入 stdout
并且带有参数的 print
将其概括为任意流。写入流与写入输出迭代器根本不同,因为它涉及额外的缓冲、同步等。其他语言通常使用“打印”来实现此类功能,因此在 {fmt} 中遵循此约定。
这变得模糊,因为您可以有一个写入流的输出迭代器,但即使在那里,当前的命名也反映了正在使用的高级 API。
换句话说,format_to
基本上是一个奇特的 STL 算法(甚至 format_to_n
类似于 copy
/copy_n
),而 print
是一个格式化输出函数。