C++20 std::format 替换 fmtlib 的注意点
临时更一篇关于 format 的内容,经验之谈,置为三星。 进入 C++ 标准的库,实践时日往往很久,像 fmtlib、range-v3 这些经典库都已存在十年以上。不受标准牢笼,一个库的发展会快速许多,是以其本身的功能要比加入标准的完善很多。例如 fmtlib,它比 std::format 使用起来更加方便,能直接支持 Formatting Ranges、Formatted Output、Terminal Color 等诸多功能,而这些功能要完全加入标准,可能得等到 C++29 了。 我在某个 C++20 库的开发中就需要使用 format,当时想着 fmtlib 功能更加完善,便没有直接使用 std::format。但后来就遇到了问题,首先是 fmtlib 有诸多版本,版本之间可能存在差异,用户可能并不像我们这般熟悉 C++,编译之时,问题千奇百怪;其次是在用户机器上可能会出现一些莫名其妙的问题,而这些问题放到自己的机器上却不会出现,分析起来将花费大量时间;最后是编译错误信息,fmtlib 开发之时,Concepts 还未进标准,而其采用的定制方式是模板特化,稍微出现一点问题便会弹出满屏的模板错误,而这些错误信息和真实错误毫不相关,加大了定位问题的难度。 总而言之,fmtlib 隐藏的坑不小,换成 std::format 能够避免很多细微的隐患,减少普通用户的抱怨声。 然而,std::format 缺少很多 fmtlib 直接具备的功能,替换也并非那么简单,本篇讲解的就是这些替换的细节。 下面分成三部分关键点进行讨论。 第一,运行期定制。 std::formatter 默认只支持编译期定制,在 fmtlib 中存在 fmt::runtime 可以编写运行期的定制。比如,下面是一个使用 fmtlib 定制 response 的例子:… Continue Reading C++20 std::format 替换 fmtlib 的注意点