web-dev-qa-db-fra.com

c ++ entier-> conversion std :: string. Fonction simple?

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++?

76
Paul Nathan

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

134

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 &){
 ...
}
28
Mic

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).

22
David Thornley