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)

现在很明显,一个人可以整天骑车改名字,但这里的问题是 而不是 为什么我们有 formatprint(哪个对我来说很容易解释),但是为什么一个明显(?)表现得像 write-to-stream-kind 的函数与 format_... 命名风格捆绑在一起。

因此,正如问题标题已经提出的那样,格式化为流时 fmt::print(stream, ...) 的行为与 fmt::format_to(OutputIt, ...) 的行为是否存在 技术差异格式化为输出迭代器时的行为?

或者was/is这纯粹是风格的选择?另外,考虑到这里的 GitHube repo explicitly lists the 标签,我希望我们能从原 API 作者那里得到权威的答案。

虽然可以命名为 format_to print,但前者在概念上更接近 format 而不是 printformat_toformat 的推广,它通过输出迭代器而不是 std::string 写入输出。因此命名反映了这一点。

另一方面,没有流参数的

print 写入 stdout 并且带有参数的 print 将其概括为任意流。写入流与写入输出迭代器根本不同,因为它涉及额外的缓冲、同步等。其他语言通常使用“打印”来实现此类功能,因此在 {fmt} 中遵循此约定。

这变得模糊,因为您可以有一个写入流的输出迭代器,但即使在那里,当前的命名也反映了正在使用的高级 API。

换句话说,format_to 基本上是一个奇特的 STL 算法(甚至 format_to_n 类似于 copy/copy_n),而 print 是一个格式化输出函数。