Интересно, как можно иметь Java-метод toString в C ++ для преобразования типов данных в строку. Например, каким образом можно было бы иметь следующий код на C ++.
public byte[] myMsg = new byte[Length];
public int intValue;
public double doubleValue;
String out1 = new String();
String out2 = new String();
String out3 = new String();
out1 += ("X; " + Long.toString((intValue& 0x1fffffff) + 0x100000000L, 16).substring(1).toUpperCase() + ";");
out2 += (" " + (Integer.toString((this.myMsg[i] & 0xff) + 0x100, 16).substring(1)).toUpperCase());
out3 += ("; " + Double.toString(doubleValue));
Да, C ++ 11 вводит нечто подобное в std::to_string
.
До этого самой безопасной ставкой было использование std::stringstream
, заполните его operator <<
и получить string
с .str()
,
C ++ 11 добавлен to_string
функции стандартной библиотеки; Проверь их
Кроме того, библиотека Boost имеет lexical_cast
.
Или вы можете написать свой собственный, используя, например, один из std::ostringstream
(от <sstream>
) или средства библиотеки C. Последнее, как правило, более эффективно (на практике).
Для общих выражений конкатенации + форматирования, которые вы показываете, вместо этого вы должны рассмотреть общий форматировщик, который может делать это за линейное время.
Простой (не особенно эффективный или многофункциональный) такой форматер показан полностью в ответ на другой вопрос.
Шаблоны
Код:
template <typename T>
std::string toString(const T &val_p)
{
std::stringstream x;
x << val_p;
return x.str();
}
Эта функция преобразует ЛЮБОЙ тип объекта в строку, если определен соответствующий оператор вставки ostream. Чтобы преобразовать пользовательские объекты, вы просто пишете функцию:
Код:
std::ostream &operator<<(std::ostream &stream_p, const my_class &val_p)
{
// ...
return stream_p;
}
Да, C ++ 11 сделал to_string
часть его языка (как свободная функция).
Однако это не заменяет использование ostringstream
и если вы строите строку из множества объектов, лучше продолжать использовать ostringstream
вместо того, чтобы преобразовывать каждый элемент в строку и объединять их.
Причина в том, что когда вы используете ostringstream
, он создаст буфер для записи выходных данных. Когда вы звоните to_string
затем объединить, вероятно to_string
создаст свой ostringstream
объект со своим собственным буфером.
Если пользователи собираются использовать оператор + для объединения строк, это будет очень неэффективно. Если они создают большой поток ostring для начала, вы также можете передавать объекты напрямую, а не вызывать to_string для них в первую очередь.
Я на самом деле предвижу, что это в основном используется для регистрации и выдачи исключений. В последнем случае эффективность, вероятно, не имеет значения.
(Код, который я видел с использованием библиотеки datetime и потоковой передачи boost, обычно страдает от неэффективности «создания нового фасета и локали для каждой даты, которую я печатаю / анализирую». Я исправил эту неэффективность в 2 компаниях, где я работал).