Пользовательская функция форматирования {fmt} с проверкой строки формата времени компиляции

У меня есть собственные функции ведения журнала. Я хочу использовать 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...);
}

Это приводит к той же ошибке, что и прямой вызов.

Другие вопросы по тегам