带有编译时格式字符串检查的自定义 fmt 格式化函数

Posted

技术标签:

【中文标题】带有编译时格式字符串检查的自定义 fmt 格式化函数【英文标题】:Custom fmt formatting function with compile time format string checking带有编译时格式字符串检查的自定义 fmt 格式化函数 【发布时间】:2019-09-13 10:08:05 【问题描述】:

我有自己的日志记录功能。我想用libfmt来格式化日志参数,例如:

log_error("Error on read: ", errMsg);

但是,编译时格式字符串检查似乎只有在我直接调用打印/格式化函数时才有效,而不是在我的日志函数中调用它们:

#include <fmt/format.h>

template<typename ...Args>
void log_error(fmt::string_view format, const Args& ...args) 
    // Log function stripped down to the essentials for this example
    fmt::print(format, args...);


int main()

    // No errors on this line
    log_error(FMT_STRING("Format with too few and wrong type arguments :d"), "one", 2.0);
    // Compile errors on the next line
    // fmt::print(FMT_STRING("Format with too few and wrong type arguments :d"), "one", 2.0);

上面的代码和错误(如果第二行没有注释的话)可以在godbolt看到

有没有办法让这个编译时格式检查在我自己的日志函数中工作?

【问题讨论】:

【参考方案1】:

您可以将格式字符串作为另一个模板传递给自定义log_error 实现。示例:

template<typename Str, typename ...Args>
void log_error(const Str& format, const Args& ...args) 
    fmt::print(format, args...);

这会产生与直接调用相同的错误。

【讨论】:

以上是关于带有编译时格式字符串检查的自定义 fmt 格式化函数的主要内容,如果未能解决你的问题,请参考以下文章

带有 fmt 的自定义格式说明符用于自定义类

fmt:编译时字符串格式检查不起作用

fmt 库:如何使用 RegEx 添加编译时字符串检查?

js时间类型的自定义转换库 datetime-fmt

Apps 脚本:带有文本的自定义数字格式

C++ FMT 问题格式化自定义抽象类