Как сформировать строку C++ из конкатенаций строковых литералов?

Я хотел бы объединить строковые литералы и целые числа, например:
string message("That value should be between " + MIN_VALUE + " and " + MAX_VALUE);

Но это дает мне эту ошибку:

error: invalid operands of types ‘const char*’ and ‘const char [6]’ to binary ‘operator+’|

Каков правильный способ сделать это? Я мог бы разделить это на 2 строковых объявления (каждое из которых объединяет строковый литерал и целое число), но это уродливо. Я также пробовал оператор ‹‹.

Спасибо


person Carcamano    schedule 06.06.2011    source источник


Ответы (5)


Вероятно, вам следует использовать stringstream для этого.

#include <sstream>

std::stringstream s;
s << "This value shoud be between " << MIN_VALUE << " and " << MAX_VALUE;
message = s.str();
person Matei Gruber    schedule 06.06.2011
comment
Было бы неплохо, если бы был более простой способ. Но спасибо, работает. - person Carcamano; 07.06.2011

С++ способ сделать это — использовать stringstream, тогда вы можете использовать ‹‹ оператор. Это даст вам ощущение более последовательного кода

person rerun    schedule 06.06.2011

Есть много способов сделать это, но мой любимый:

string message(string("That value should be between ") + MIN_VALUE + " and " + MAX_VALUE);

Этот дополнительный string() вокруг первого литерала имеет все значение в мире, потому что есть перегруженный string::operator+(const char*), который возвращает string, а operator+ имеет ассоциативность слева направо, поэтому все это превращается в цепочку вызовов operator+.

person HighCommander4    schedule 06.06.2011
comment
std::string перегружает + для типов char, но не для целых чисел, поэтому, если MIN_VALUE не является какой-либо строкой, это вполне может скомпилироваться во что-то неожиданное. - person Dennis Zickefoose; 07.06.2011
comment
Верно, но в данном случае MIN_VALUE и MAX_VALUE являются строковыми литералами. - person HighCommander4; 07.06.2011
comment
Ошибка компилятора, которую он вставил, предполагает это, но он говорит о конкатенации целых чисел, поэтому я считаю это важным соображением. Я делаю то же самое в своем коде, поэтому я знаю, что преобразование int-›char может вас укусить, если вы не следите за ним :-) - person Dennis Zickefoose; 07.06.2011
comment
Конечно. На самом деле я написал для себя шаблонный оператор+(string, T), который принимает любой тип и stringstream-преобразует его в строку... не уверен, что с этим есть какие-то ошибки, но я пока не сталкивался с ними. - person HighCommander4; 07.06.2011
comment
Я понимаю. В этом случае используйте stringstreams, как уже упоминалось. Если они кажутся вам громоздкими, вы можете использовать boost::lexical_cast (или написать свой собственный). В C++0x будет функция std::to_string(), которая обрабатывает встроенные числовые типы. - person HighCommander4; 07.06.2011

Вероятно, вы захотите использовать строковый поток следующим образом:

std::stringstream msgstream;
msgstream << "That value should be between " << MIN_VALUE << " and " <<  MAX_VALUE;
std::string message(msgstream.c_str());
person Timo Geusch    schedule 06.06.2011
comment
Откуда берутся плюсы? Этот синтаксис во всех отношениях сломан. - person ildjarn; 07.06.2011

person    schedule
comment
Или используйте boost::lexical_cast, что довольно много вашего Str шаблона. - person Fred Larson; 07.06.2011