Есть ли быстрый и простой способ получить форматирование sprintf как при построении std::string? Что-то вроде...
std::string foo("A number (%d) and a character (%c).\n", 18, 'a');
Есть ли быстрый и простой способ получить форматирование sprintf как при построении std::string? Что-то вроде...
std::string foo("A number (%d) and a character (%c).\n", 18, 'a');
Не встроен в конструктор строк, но вы можете проверить форматировать. Это более типичное форматирование строки стиля sprintf. С этим вы можете хотя бы сделать это:
std::string foo =
boost::str(boost::format("A number (%d) and a character (%c)\n") % 18 % 'a');
Я написал класс 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.
Библиотека формата С++ обеспечивает безопасную реализацию 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, но намного быстрее, довольно мало и не имеет внешних зависимостей, кроме стандартной библиотеки С++.
Отказ от ответственности: я являюсь автором этой библиотеки.
Как насчет этого, он использует 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);
}