Предпочтительный метод форматирования строк в С++?

Это немного многословно, на мой вкус:

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

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


person alexm    schedule 11.12.2014    source источник
comment
как printf или sprintf вы имеете в виду?   -  person RobP    schedule 11.12.2014
comment
Вы можете проверить формат повышения: boost.org/doc/libs/1_55_0/ библиотеки/формат   -  person Adrian Cornish    schedule 11.12.2014
comment
да, как sprintf, но с типобезопасностью.   -  person alexm    schedule 11.12.2014
comment
См. также: stackoverflow.com/questions/2342162/   -  person uncletall    schedule 11.12.2014
comment
@ Адриан: спасибо, это то, что я искал   -  person alexm    schedule 11.12.2014
comment
Да, Boost.Format - это ответ.   -  person Lightness Races in Orbit    schedule 11.12.2014
comment
@πάντα ῥεῖ Тьфу, этот вопрос и ответы на него ужасны. Жаль, что вы не закрыли это; Я только что собирался отправить хороший ответ с хорошим примером для конкретного вопроса этого OP. Вздох. Ну что ж.   -  person Lightness Races in Orbit    schedule 11.12.2014
comment
@LightnessRacesinOrbit К вашим услугам, вновь открылся ;-) ...   -  person πάντα ῥεῖ    schedule 11.12.2014
comment
Согласитесь, это не дубликат, как его спросили - Алекс явно хотел чего-то другого, хотя формат boost находится в этом вопросе в конце списка.   -  person Adrian Cornish    schedule 11.12.2014
comment
Думаю, формат boost был вдохновлен Python. даже несмотря на то, что Python 3 отказался от синтаксиса.   -  person v.oddou    schedule 11.12.2014
comment
Если вам действительно нужна однострочник, вы можете сделать это: string msg = (ostringstream("Selected elements: ") << i << "," << j << ".").str(); Обратите внимание на использование ostringstream вместо ostrstream.   -  person Remy Lebeau    schedule 11.12.2014
comment
@Реми Здорово! Элегантным я бы это не назвал :)   -  person MatiasFG    schedule 11.12.2014
comment
@LightnessRacesinOrbit Я как раз собирался отправить хороший ответ с хорошим примером для конкретного вопроса этой ОП. ??   -  person πάντα ῥεῖ    schedule 11.12.2014
comment
@πάνταῥεῖ Я пошел спать.   -  person Lightness Races in Orbit    schedule 11.12.2014
comment
Возможный дубликат: stackoverflow.com/q/2342162/560648 (но я все еще не уверен)   -  person Lightness Races in Orbit    schedule 11.12.2014


Ответы (2)


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

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

(демонстрация)

person Lightness Races in Orbit    schedule 11.12.2014

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

ИЗМЕНИТЬ

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

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) + ".");
person dconman    schedule 11.12.2014
comment
это не может работать. sprintf выводит результат в свой первый аргумент. здесь ваш первый аргумент - это строка формата. который должен быть константой. - person v.oddou; 11.12.2014
comment
std::sprintf() — худшая рекомендация, которую я могу здесь придумать. - person πάντα ῥεῖ; 11.12.2014