Pregunta

Problema: tengo un número entero; este entero necesita ser convertido a un tipo stl :: string.

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

¿Hay una mejor manera de hacer esto?

Aquí está el enfoque de secuencia de cadena 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 reescribirse 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 buena, sin embargo:

std::string s = t_to_string(my_integer);

En cualquier caso, una mejor manera sería ... agradable.

  

Relacionado:

     

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

¿Fue útil?

Solución

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

Otros consejos

Como se mencionó anteriormente, recomendaría impulsar lexical_cast. No solo tiene una sintaxis bastante agradable:

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

también proporciona cierta seguridad:

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

No realmente, en el estándar. Algunas implementaciones tienen una función itoa () no estándar, y puedes buscar el lexical_cast de Boost, pero si te apegas al estándar, es más o menos una elección entre stringstream y sprintf () (snprintf () si lo tienes).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top