c ++ Ganzzahl-> std :: string Konvertierung. Einfache Funktion?

76

Problem: Ich habe eine ganze Zahl; Diese Ganzzahl muss in einen stl :: string-Typ konvertiert werden.

In der Vergangenheit habe stringstreamich eine Konvertierung durchgeführt, und das ist nur ein bisschen umständlich. Ich weiß, dass der C-Weg darin besteht, a zu machen sprintf, aber ich würde viel lieber eine typsichere C ++ - Methode machen.

Gibt es einen besseren Weg, dies zu tun?

Hier ist der Stringstream-Ansatz, den ich in der Vergangenheit verwendet habe:

std::string intToString(int i)
{
    std::stringstream ss;
    std::string s;
    ss << i;
    s = ss.str();

    return s;
}

Dies könnte natürlich folgendermaßen umgeschrieben werden:

template<class T>
std::string t_to_string(T i)
{
    std::stringstream ss;
    std::string s;
    ss << i;
    s = ss.str();

    return s;
}

Ich habe jedoch die Vorstellung, dass dies eine ziemlich "schwere" Implementierung ist.

Zan bemerkte jedoch, dass der Aufruf ziemlich nett ist:

std::string s = t_to_string(my_integer);

Ein schöner Weg wäre jedenfalls ... schön.

Verbunden:

Alternative zu itoa () zum Konvertieren von Integer in String C ++?

Paul Nathan
quelle
In Ihrem Beispiel t_to_string kann ich nicht erkennen, warum eine Vorlagenspezifikation erforderlich ist. Eine Vorlagenfunktion kann ihren Vorlagentyp anhand ihrer Argumenttypen bestimmen.
Zan Lynx
@ Zan: Durp. Das bekomme ich für den Postleitzahl, den ich nicht kompiliert habe.
Paul Nathan
13
Wie wäre es mit einigen Beispielen aus dem Folgenden: codeproject.com/KB/recipes/Tokenizer.aspx Sie sind sehr effizient und etwas elegant.
@Beh: Diese Bibliothek ist erheblich schwerer als ein einfacher t_to_string (). Eigentlich sieht es nach einer sehr schönen Bibliothek aus, aber ich möchte das Ganze nicht importieren, nur um einen t_to_string () zu machen.
Paul Nathan

Antworten:

134

Jetzt in c ++ 11 haben wir

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

Link zur Referenz: http://en.cppreference.com/w/cpp/string/basic_string/to_string

Johannes Schaub - litb
quelle
Sehr schick. Haben Sie einen Link zur Standardseite, die die Funktion beschreibt?
Paul Nathan
6
Compilerfehler für mich - "std :: to_string: mehrdeutiger Aufruf der überladenen Funktion"
JMarsch
8
Ich würde das in " Endlich haben wir ..." umformulieren .
Sam Goldberg
28

Wie bereits erwähnt, würde ich Boost lexical_cast empfehlen. Es hat nicht nur eine ziemlich schöne Syntax:

#include <boost/lexical_cast.hpp>
std::string s = boost::lexical_cast<std::string>(i);

es bietet auch einige Sicherheit:

try{
  std::string s = boost::lexical_cast<std::string>(i);
}catch(boost::bad_lexical_cast &){
 ...
}
Mic
quelle
22

Nicht wirklich im Standard. Einige Implementierungen haben eine nicht standardmäßige itoa () -Funktion, und Sie könnten Boosts lexical_cast nachschlagen, aber wenn Sie sich an den Standard halten, ist es so ziemlich eine Wahl zwischen stringstream und sprintf () (snprintf (), wenn Sie ihn haben).

David Thornley
quelle
2
Gut, dass dies behoben wurde, siehe Schaubs Antwort
siehe