Форматирование строк как в printf

Рейтинг: 0Ответов: 1Опубликовано: 06.08.2023

Я много искал по поводу форматирования строк как в стандартной C функции printf, так и не нашел того что мне нужно

printf("Hello, %s!\n", name);

У меня есть свой собственной логгер ошибок, предупреждений и обычных сообщений по ходу работы программы. Он выглядит так:

CLog::PrintLine(std::format("Hello, {}", name), CLog::Warning)

Мне не нравится постоянное использование std::format при работе с моим логгером. Могу ли я реализовать форматирование как в printf используя VA аргументы?

Ответы

▲ 2Принят

Вместо постоянного вызывания std::format можно пробрасывать ему аргументы, уровень значимости тоже удобнее обернуть в функцию вместо постоянного вызывания CLog::Warning, чтобы по итогу выходило CLog::PrintWarning("Hello, {}", name);:

#include <format>
#include <string>
#include <cassert>

template<typename... ArgsPack>
auto MyFormat(::std::format_string<ArgsPack...> fmt, ArgsPack &&... args_pack)
{
    return ::std::vformat(fmt.get(), ::std::make_format_args(args_pack...));
}

int main()
{
    assert("-=123=-" == MyFormat("-={}=-", 123));
}

online compiler