2014-12-11 2 views
4

Это немного многословно на мой вкус:Предпочтительный метод форматирования строк в C++?

ostrstream ss; 
ss << "Selected elements: " << i << "," << j << "."; 
string msg(ss.str(), (size_t)ss.pcount()); 

Есть элегантный способ форматирования текстового сообщения, используя краткое изложение одной строки, возможно, с помощью шаблонов или макросов?

+0

как '' printf' или sprintf' вы имеете в виду? – RobP

+4

Вы можете проверить формат форматирования: http://www.boost.org/doc/libs/1_55_0/libs/format/ – Adrian

+0

Да, как и sprintf, но с типом. – alexm

ответ

2

Да; Вы ищете Boost.Format:

const int i = 3, j = 4; 
const std::string msg = (boost::format("Selected elements: %d %d") % i % j).str(); 

(live demo)

-6

Что вы, скорее всего, ищете, это sprintf, который работает как printf, но возвращает cstring. Таким образом, ваш код будет
string msg(sprintf("Selected elements: %d, %d.", i, j))

EDIT

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

std::string itostr(int i) 
{ 
    char temp[20]; 
    std::sprintf(temp, "%d" i); 
    std::string out(temp); 
    return out; 
} 

Тогда вы можете просто использовать оператор + для конкатентных строк.

string msg("Selected elements: " + itostr(i) + "," + itostr(j) + "."); 
+0

это не сработает. 'sprintf' выводит результат в свой первый аргумент. здесь ваш первый аргумент - это строка формата. который должен быть постоянным. –

+0

Кроме того, ОП просил ввести тип безопасности. Это далеко не правильный ответ ... –

+0

_'std :: sprintf() '_ - худшая рекомендация, о которой я могу думать здесь. –

Смежные вопросы