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