Java ToString метод в переполнении стека

Интересно, как можно иметь 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));

0

Решение

Да, C ++ 11 вводит нечто подобное в std::to_string.

До этого самой безопасной ставкой было использование std::stringstream, заполните его operator <<и получить string с .str(),

9

Другие решения

C ++ 11 добавлен to_string функции стандартной библиотеки; Проверь их

Кроме того, библиотека Boost имеет lexical_cast.

Или вы можете написать свой собственный, используя, например, один из std::ostringstream (от <sstream>) или средства библиотеки C. Последнее, как правило, более эффективно (на практике).

Для общих выражений конкатенации + форматирования, которые вы показываете, вместо этого вы должны рассмотреть общий форматировщик, который может делать это за линейное время.

Простой (не особенно эффективный или многофункциональный) такой форматер показан полностью в ответ на другой вопрос.

5

Шаблоны

Код:

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;
}
3

Да, C ++ 11 сделал to_string часть его языка (как свободная функция).

Однако это не заменяет использование ostringstreamи если вы строите строку из множества объектов, лучше продолжать использовать ostringstream вместо того, чтобы преобразовывать каждый элемент в строку и объединять их.

Причина в том, что когда вы используете ostringstream, он создаст буфер для записи выходных данных. Когда вы звоните to_string затем объединить, вероятно to_string создаст свой ostringstream объект со своим собственным буфером.

Если пользователи собираются использовать оператор + для объединения строк, это будет очень неэффективно. Если они создают большой поток ostring для начала, вы также можете передавать объекты напрямую, а не вызывать to_string для них в первую очередь.

Я на самом деле предвижу, что это в основном используется для регистрации и выдачи исключений. В последнем случае эффективность, вероятно, не имеет значения.

(Код, который я видел с использованием библиотеки datetime и потоковой передачи boost, обычно страдает от неэффективности «создания нового фасета и локали для каждой даты, которую я печатаю / анализирую». Я исправил эту неэффективность в 2 компаниях, где я работал).

2
По вопросам рекламы [email protected]