自定义{fmt}格式化功能,可进行编译时格式字符串检查

时间:2019-09-13 10:08:05

标签: c++ fmt

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

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

但是,编译时间格式字符串检查似乎仅在我直接调用print / format函数时才起作用,而不是在日志函数中调用时:

#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 个答案:

答案 0 :(得分:4)

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

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

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