Кормление 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.