Кормление Boost:: формат с переменными параметрами

Я пытаюсь написать функцию ведения журнала, которая принимает список аргументов с переменным значением и печатает в безопасном поместье.
vprintf кажется очевидным ответом, но я не могу найти безопасный способ обработки, когда строка формата ожидает больше аргументов, чем было предоставлено.

Кроме того, было бы очень хорошо, если бы я мог изменить порядок печати параметров.
Это второе требование привело меня к boost::format, который, кажется, именно то, что я хочу, за исключением того, что он не принимает va_list для ввода.

Я сделал несколько обширных поисков, и самое близкое, что я мог получить, было это решение:
boost:: format с переменными аргументами шаблона

К сожалению, я ограничен конкретной версией gcc, которая, кажется, не включает std::initializer_list

В моих поисках я наткнулся на boost::preprocessor кажется, что он должен быть в состоянии выполнить то, что я хочу, но я борюсь с его реализацией.

Итак, в идеале, я ищу то, что работает следующим образом:

void loggerFunc(const char* msgFormat, ...){
    boost::format f(msgFormat);

    va_list args;
    va_start(args, msg);

    f & MagicalFunctionCall(args);

    va_end(args);
}

Где это MagicalFunctionCall(args) конвертировал бы мои аргументы, например:
1, "Test", 3.4, "OtherString"
в нечто вроде:
1 & "Test" & 3.4 & "OtherString"

Я не обязательно привязан к boost::preprocessor или что-нибудь boost на самом деле, но было бы идеально сделать это, не добавляя каких-либо дополнительных сторонних зависимостей (мы уже используем boost в других местах проекта). Я просто предложил эти библиотеки, потому что они казались наиболее перспективными в выполнении всего вышеперечисленного.

Спасибо!

1 ответ

Решение

Вместо Boost Format вы можете использовать библиотеку fmt, которая поддерживает старые компиляторы:

void loggerFunc(const char *format, fmt::ArgList args) {
  std::string s = fmt::format(format, args);
  // log s
}
FMT_VARIADIC(void, loggerFunc, const char *)

loggerFunc создано FMT_VARIADIC может использоваться с переменным числом аргументов:

loggerFunc("{} {} {} {}", 1, "Test", 3.4, "OtherString");

Отказ от ответственности: я автор библиотеки fmt.

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