Быстрое форматирование строк в С++

Есть ли быстрый и простой способ получить форматирование 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); 
}