conversione c ++ integer- > std :: string. Funzione semplice?
Domanda
Problema: ho un numero intero; questo numero intero deve essere convertito in un tipo stl :: string.
In passato, ho usato stringstream
per fare una conversione, ed è un po 'ingombrante. So che il modo C è fare un sprintf
, ma preferirei piuttosto un metodo C ++ che sia typesafe (er).
C'è un modo migliore per farlo?
Ecco l'approccio stringstream che ho usato in passato:
std::string intToString(int i)
{
std::stringstream ss;
std::string s;
ss << i;
s = ss.str();
return s;
}
Naturalmente, questo potrebbe essere riscritto in questo modo:
template<class T>
std::string t_to_string(T i)
{
std::stringstream ss;
std::string s;
ss << i;
s = ss.str();
return s;
}
Tuttavia, ho l'idea che si tratti di un'implementazione abbastanza "pesante".
Zan ha notato che l'invocazione è piuttosto carina, tuttavia:
std::string s = t_to_string(my_integer);
Ad ogni modo, un modo migliore sarebbe ... carino.
Related:
Alternativa a itoa () per convertire numeri interi in stringhe C ++ ?
Soluzione
Ora in c ++ 11 abbiamo
#include <string>
string s = std::to_string(123);
Link al riferimento: http://en.cppreference.com/w/cpp/string/basic_string / to_string
Altri suggerimenti
Come accennato in precedenza, consiglierei di aumentare lexical_cast. Non solo ha una sintassi abbastanza buona:
#include <boost/lexical_cast.hpp>
std::string s = boost::lexical_cast<std::string>(i);
fornisce anche un po 'di sicurezza:
try{
std::string s = boost::lexical_cast<std::string>(i);
}catch(boost::bad_lexical_cast &){
...
}
Non proprio, nello standard. Alcune implementazioni hanno una funzione itoa () non standard e potresti cercare il lexical_cast di Boost, ma se ti attieni allo standard è praticamente una scelta tra stringstream e sprintf () (snprintf () se ce l'hai).