Problème: j'ai un entier; cet entier doit être converti en un type stl :: string.
Dans le passé, j’avais utilisé stringstream
pour effectuer une conversion, et c’est un peu fastidieux. Je sais que la méthode C consiste à faire un sprintf
, mais je préférerais de beaucoup utiliser une méthode C++ dactylographiée (er).
Y a-t-il une meilleure manière de faire cela?
Voici l'approche de stringstream que j'ai utilisée par le passé:
std::string intToString(int i)
{
std::stringstream ss;
std::string s;
ss << i;
s = ss.str();
return s;
}
Bien sûr, cela pourrait être réécrit comme suit:
template<class T>
std::string t_to_string(T i)
{
std::stringstream ss;
std::string s;
ss << i;
s = ss.str();
return s;
}
Cependant, je pense qu’il s’agit d’une implémentation assez lourde.
Zan a noté que l'invocation est jolie, cependant:
std::string s = t_to_string(my_integer);
En tout cas, une meilleure façon serait ... Nice.
En relation:
Alternative à itoa () pour convertir un entier en chaîne C++?
Maintenant en c ++ 11 nous avons
#include <string>
string s = std::to_string(123);
Lien vers la référence: http://fr.cppreference.com/w/cpp/string/basic_string/to_string
Comme mentionné précédemment, je recommanderais boost lexical_cast. Non seulement sa syntaxe est assez jolie:
#include <boost/lexical_cast.hpp>
std::string s = boost::lexical_cast<std::string>(i);
il fournit également une certaine sécurité:
try{
std::string s = boost::lexical_cast<std::string>(i);
}catch(boost::bad_lexical_cast &){
...
}
Pas vraiment, dans la norme. Certaines implémentations ont une fonction itoa () non standard, et vous pouvez rechercher lexical_cast de Boost, mais si vous vous en tenez à la norme, vous aurez le choix entre stringstream et sprintf () (snprintf () si vous l'avez).