1

我目前正在结束为基于网格的量子计算开发仅包含 C++ 标头的模板库,并且我正在考虑替换我几乎在一开始就编写的旧日志记录模块。

我知道让一个仅标头的库将内容打印到标准输出(和文件)听起来有点奇怪,但我大量使用模板来提高运行时二进制文件的灵活性和效率,因此选择了这个。

当前的日志记录模块使用 printf(因为我不喜欢语法 )、std::cout宏、可变参数宏(##__VA_ARGS____FILE____LINE__

用(或类似的东西)替换它是否有意义,fmt或者我应该尝试对现有的进行现代化改造(即用模板替换可变参数宏,自定义构建的 compile-timestring_view等)?

我希望图书馆“立即”工作,也就是说,我想:

a) 尽可能多地消除依赖

b)find_package(fmt)在 CMake 中静默尝试或 FetchContent - (顺便说一句。这种行为是否有通用的 CMake“模板”?类似于“find_or_fetch”?)

c) 将基本部分fmt作为 git 子模块放在我的项目中,并包含一个小头文件。

除此之外,我还计划使用 HDF5 库(有或没有 C++ 包装器)。再次在这里,我不确定如何最好地处理它以使集成尽可能无缝,我也没有决定应该使用哪个包装器。“find_or_fetch”范式是否适合仅标头库?

4

2 回答 2

2

如果您进行大量格式化并且{fmt}旨在支持轻松嵌入,这是有道理的。特别是,它具有零依赖性并且相对较小,最小配置仅包含三个中等大小的文件。有几个嵌入 {fmt} 的项目,例如spdlog。与推出自己的格式化解决方案相比,它的优势在于将来很容易移植std::format

于 2021-07-27T15:15:04.967 回答
1

如果我是你,我不会。

  • 仅标头库意味着简约。fmt与此相反。
  • 仅标头库意味着用户友好。强制对用户的大量依赖不是很友好。
  • 如果您在不需要更好的日志记录工具的情况下已经走了这么远,那么您使用的工具很可能已经足够好了。
  • 必须匹配格式字符串和参数是不使用fmt. 但是你已经完成了匹配。只要格式字符串是文字,现代编译器就会警告任何不匹配。
于 2021-07-27T04:12:32.360 回答