К std::string
можно добавлять только другие std::string
s, текст ASCIIZ по адресу, указанному const char*
, и отдельные char
-актеры.
Чтобы объединить другие типы, вы можете:
использовать поток:
std :: ostringstream oss;
oss << "мы сделали" << a_uint << "и получили" << результат;
throw std :: runtime_error (oss.str ()); </p>
сначала преобразовать его в строковое представление:
throw std :: runtime_error (std :: string ("мы сделали") +
boost :: lexical_cast (a_uint) +
"и получил" +
повышение :: lexical_cast (результат));
Вы можете разумно задаться вопросом , почему C ++ не обеспечивает operator+(std::string&, X&)
для X в {short, int, long, long long, float, double, unsigned short и т. Д.}, Или даже:
template <typename T>
std::string operator+(std::string& s, T& t)
{
std::ostringstream oss;
oss << t;
return s + oss.str();
}
Во многих случаях это было бы удобно. Но потоки более мощные, так как вы можете настроить ширину и символ заполнения, точность с плавающей запятой и т. Д. Кроме того, char - это 8-битный целочисленный тип, так как компилятор может узнать, добавлять ли один символ с этим значением ASCII (например, 'A' для 65), или ASCII-представление числового значения ASCII "65"? (В настоящее время он не обрабатывает целые числа, поэтому его не следует путать с ASCII char
). Или это должно работать для> = 16-битных чисел, но не для 8? Это сделало бы невозможным изменение размера переменных в / из 8-битных целых без необходимости выполнять сложный анализ влияния, чтобы увидеть, какие строковые операции необходимо переписать. Также рекомендуется минимизировать зависимости: некоторый небольшой, но, возможно, значительный процент единиц перевода, использующих строку, в настоящее время может не включать (и, следовательно, тратить время на разбор) (и, следовательно, ostream и т. Д.), И в целом циклические зависимости являются «запахом кода» и разочаровывающая тестируемость (строка зависит от ostringstream, зависит от строки ...).