Pregunta c ++ integer-> std :: cadena de conversión. Función simple?


Problema: tengo un número entero; este entero debe convertirse a un tipo stl :: string.

En el pasado, he usado stringstream hacer una conversión, y eso es algo engorroso. Sé que la forma C es hacer una sprintf, pero preferiría hacer un método C ++ que sea seguro para el tipo (er).

¿Hay una mejor manera de hacer esto?

Aquí está el enfoque de cadena de caracteres que he usado en el pasado:

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

    return s;
}

Por supuesto, esto podría ser reescrito así:

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

    return s;
}

Sin embargo, tengo la idea de que esta es una implementación bastante 'pesada'.

Zan señaló que la invocación es bastante agradable, sin embargo:

std::string s = t_to_string(my_integer);

En cualquier caso, una forma más agradable sería ... agradable.

Relacionado:

¿Alternativa a itoa () para convertir un entero a la cadena C ++? 


75
2017-11-07 22:52


origen


Respuestas:


Ahora en c ++ 11 tenemos

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

Enlace a la referencia: http://en.cppreference.com/w/cpp/string/basic_string/to_string


133
2017-12-02 20:12



Como mencioné anteriormente, recomendaría boost lexical_cast. No solo tiene una sintaxis bastante buena:

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

también proporciona algo de seguridad:

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

28
2017-11-07 23:14



No realmente, en el estándar. Algunas implementaciones tienen una función itoa () no estándar, y usted puede buscar la versión lexical_cast de Boost, pero si se apega al estándar, es prácticamente una elección entre stringstream y sprintf () (snprintf () si lo tiene).


22
2017-11-07 22:55