Question

Problème: j'ai un entier; cet entier doit être converti en un type stl :: string.

Dans le passé, j’utilisais stringstream pour effectuer une conversion, ce qui est plutôt fastidieux. Je sais que la méthode C consiste à faire un sprintf , mais je préférerais de loin une méthode C ++ dactylographiée (er).

Y a-t-il une meilleure façon de faire cela?

Voici l’approche 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, j’ai la notion qu’il s’agit d’une implémentation assez lourde.

Zan a noté que l’invocation était plutôt agréable, cependant:

std::string s = t_to_string(my_integer);

En tout état de cause, une meilleure solution serait ... agréable.

  

Connexes:

     

Alternative à itoa () pour convertir un entier en chaîne C ++ ?

Était-ce utile?

La solution

Maintenant en c ++ 11, nous avons

#include <string>
string s = std::to_string(123);

Lien vers la référence: http://en.cppreference.com/w/cpp/string/basic_string / to_string

Autres conseils

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 offre é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 en avez un).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top