c ++ integer- > std :: conversión de cadena. Función simple?
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 ++ ?
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).