c ++ ціле число-> std :: перетворення рядків. Проста функція?


76

Проблема: у мене ціле число; це ціле число потрібно перетворити на тип stl :: string.

Раніше я раніше stringstreamробив перетворення, і це просто трохи громіздко. Я знаю, що спосіб C - це зробити a sprintf, але я б набагато краще зробив метод C ++, який є типозахищеним (er).

Чи є кращий спосіб це зробити?

Ось підхід струнних потоків, який я використовував раніше:

std::string intToString(int i)
{
    std::stringstream ss;
    std::string s;
    ss << i;
    s = ss.str();

    return s;
}

Звичайно, це можна переписати так:

template<class T>
std::string t_to_string(T i)
{
    std::stringstream ss;
    std::string s;
    ss << i;
    s = ss.str();

    return s;
}

Однак я маю уявлення, що це досить “важка” реалізація.

Зан зазначив, що виклик досить приємний, однак:

std::string s = t_to_string(my_integer);

У кожному разі, приємніший спосіб був би ... приємним.

Пов’язані:

Альтернатива itoa () для перетворення цілого числа у рядок C ++?


У вашому прикладі t_to_string я не бачу, чому потрібна специфікація шаблону. Функція шаблону може визначати тип шаблону за типом аргументів.
Zan Lynx

@Zan: Durp. Це те, що я отримую за розміщення коду, який я не скомпілював.
Пол Натан

13
Як щодо деяких прикладів із наступного: codeproject.com/KB/recipes/Tokenizer.aspx Вони дуже ефективні та дещо елегантні.

@Beh: Ця бібліотека значно важча, ніж проста t_to_string (). Насправді це виглядає як дуже приємна бібліотека, але я не хотів би імпортувати все це, просто виконавши t_to_string ().
Пол Натан

Відповіді:


134

Тепер в c ++ 11 ми маємо

#include <string>
string s = std::to_string(123);

Посилання на посилання: http://en.cppreference.com/w/cpp/string/basic_string/to_string


Дуже пишні. Є посилання на сторінку стандарту з описом функції?
Пол Натан

6
помилки компілятора для мене - "std :: to_string: неоднозначний виклик перевантаженої функції"
JMarsch

8
Я б переформулював це на " нарешті , у нас є ...".
Сем Голдберг,

28

Як вже згадувалося раніше, я б рекомендував підсилити lexical_cast. Мало того, що він має досить приємний синтаксис:

#include <boost/lexical_cast.hpp>
std::string s = boost::lexical_cast<std::string>(i);

це також забезпечує певну безпеку:

try{
  std::string s = boost::lexical_cast<std::string>(i);
}catch(boost::bad_lexical_cast &){
 ...
}

22

Не дуже, у стандартному. Деякі реалізації мають нестандартну функцію itoa (), і ви можете шукати lexical_cast Boost, але якщо ви дотримуєтесь стандарту, це майже вибір між stringstream та sprintf () (snprintf (), якщо у вас є).


2
Добре, що це було виправлено, див . Відповідь Шауба
sehe
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.