Быстрое форматирование строк в С++
Есть ли быстрый и простой способ получить форматирование sprintf как при построении std::string? Что-то вроде...
std::string foo("A number (%d) and a character (%c).\n", 18, 'a');
Ответы
Ответ 1
Не встроен в конструктор строк, но вы можете проверить форматировать. Это более типичное форматирование строки стиля sprintf. С этим вы можете хотя бы сделать это:
std::string foo =
boost::str(boost::format("A number (%d) and a character (%c)\n") % 18 % 'a');
Ответ 2
Я написал класс stringbuilder
, который вы можете использовать, и я думаю, что это лучше, чем boost::format
, в отличие от него, stringbuilder
НЕ использует строку формата C-стиля, например %d
, %c
. и др.
Вот как stringbuilder
может помочь вам только в одной строке:
std::string s=stringbuilder() << "A number " << 18 <<" and a character " <<'a';
Реализация stringbuilder
очень проста:
struct stringbuilder
{
std::stringstream ss;
template<typename T>
stringbuilder & operator << (const T &data)
{
ss << data;
return *this;
}
operator std::string() { return ss.str(); }
};
Демо на идеоне: http://ideone.com/J9ALB
Я только что написал следующий блог, описывающий различные способы использования stringbuilder
.
Ответ 3
Библиотека формата С++ обеспечивает безопасную реализацию sprintf
, которая возвращает строку:
std::string foo(fmt::sprintf("A number (%d) and a character (%c).\n", 18, 'a'));
Эта библиотека также поддерживает Python str.format
синтаксис:
std::string foo(fmt::format("A number ({}) and a character ({}).\n", 18, 'a'));
Это похоже на Boost Format, но намного быстрее, довольно мало и не имеет внешних зависимостей, кроме стандартной библиотеки С++.
Отказ от ответственности: я являюсь автором этой библиотеки.
Ответ 4
Как насчет этого, он использует printf напрямую:
#include <stdio.h>
#include <stdarg.h>
std::string format(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
const size_t SIZE = 512;
char buffer[SIZE] = { 0 };
vsnprintf(buffer, SIZE, fmt, ap);
va_end(ap);
return std::string(buffer);
}