2015-04-01 19 views
15

Was ist der Zweck von boost::to_string (gefunden in boost/exception/to_string.hpp) und wie unterscheidet es sich von boost::lexical_cast<std::string> und std::to_string?Was ist der Unterschied zwischen std :: to_string, boost :: to_string und boost :: lexical_cast <std::string>?

+9

Wenn ich die Geschichte richtig erinnere, 'boost :: to_string' vorangegangen' std :: to_string', wie es in der Regel der Fall ist. Boost ist eher der Spielplatz für Dinge, bevor es in die Standardbibliothek aufgenommen wird. 'std :: to_string' ist neu ab C++ 11. – CoryKramer

+0

@ Cyber: Ich würde vorschlagen, Sie schreiben dies als (Teil-) Antwort. – MikeMB

+0

@CoryKramer, 'boost :: to_string' könnte älter sein, aber es ist nicht dasselbe wie' std :: to_string' und 'std :: to_string' basierte nicht darauf (sie benutzen zufällig denselben Namen). –

Antwort

21

std::to_string, verfügbar seit C++ 11, funktioniert auf grundlegende numerische Typen speziell. Es hat auch eine std::to_wstring Variante.

Es wurde entwickelt, um die gleichen Ergebnisse zu produzieren, die std::sprintf würde.

Sie können dieses Formular auswählen, um Abhängigkeiten von externen Bibliotheken/Kopfzeilen zu vermeiden.


boost::lexical_cast<std::string> Arbeiten auf jede Art, die in eine std::ostream eingesetzt werden kann, einschließlich der Typen aus anderen Bibliotheken oder Ihren eigenen Code.

Optimierte Spezialisierungen gibt es für gängige Typen, mit der generischen Form ähnelt:

template< typename OutType, typename InType > 
OutType lexical_cast(const InType & input) 
{ 
    std::stringstream temp_stream; 
    temp_stream << input; 

    OutType output; 
    temp_stream >> output; 
    return output; 
} 

Sie dieses Formular können größere Flexibilität bei der Input-Typen in generischen Funktionen nutzen, oder eine std::string von einem Typ, den Sie produzieren Know ist kein fundamentaler numerischer Typ.


boost::to_string nicht direkt dokumentiert und scheint in erster Linie für den internen Gebrauch zu sein. Seine Funktionalität verhält sich wie lexical_cast<std::string>, nicht std::to_string.

-2

gibt es mehr Unterschiede: Boost funktioniert richtig! Bitte beachten Sie den folgenden Code:

#include <limits> 
#include <iostream> 

#include "boost/lexical_cast.hpp" 

int main() 
{ 
    double maxDouble = std::numeric_limits<double>::max(); 
    std::string str(std::to_string(maxDouble)); 

    std::cout << "std::to_string(" << maxDouble << ") == " << str << std::endl; 
    std::cout << "boost::lexical_cast<std::string>(" << maxDouble << ") == " 
       << boost::lexical_cast<std::string>(maxDouble) << std::endl; 

    return 0; 
} 

$ ./to_string 
std::to_string(1.79769e+308) == 179769313486231570814527423731704356798070600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 
boost::lexical_cast<std::string>(1.79769e+308) == 1.7976931348623157e+308 
+2

Bitte tun Sie etwas mehr als nur etwas Code einzufügen. Beschreibe * was * dein Code macht und * wie * er es tut. –

+0

Es ist einfach die Ausgabe von to_string() und lexical_cast() für den gleichen doppelten Wert ;-)) –

+0

Diese Ergebnisse unterscheiden sich sicherlich - und das ist es wert. Aber mir ist nicht klar, welches Ergebnis "richtiger" ist. –

Verwandte Themen