2015-04-01 17 views
15

Jaki jest cel boost::to_string (znaleziony w boost/exception/to_string.hpp) i jak różni się on od boost::lexical_cast<std::string> i std::to_string?Jaka jest różnica między std :: to_string, boost :: to_string i boost :: lexical_cast <std::string>?

+9

Jeśli dobrze pamiętam historię, 'boost :: to_string' poprzedziło' std :: to_string', jak to zwykle bywa. Wzmocnienie wydaje się być placem zabaw dla rzeczy zanim zostanie przyjęte do standardowej biblioteki. 'std :: to_string' jest nowością od C++ 11. – CoryKramer

+0

@Cyber: Proponuję napisać to jako (częściową) odpowiedź. – MikeMB

+0

@CoryKramer, 'boost :: to_string' może być starszy, ale to nie to samo co' std :: to_string' i 'std :: to_string' nie był na nim oparty (po prostu używają tej samej nazwy). –

Odpowiedz

21

std::to_string, dostępny od C++ 11, działa na podstawowych typach numerycznych w szczególności. Ma również wariant std::to_wstring.

Został zaprojektowany w taki sposób, aby uzyskać takie same wyniki, jak w przypadku std::sprintf.

Możesz wybrać ten formularz, aby uniknąć zależności od zewnętrznych bibliotek/nagłówków.


boost::lexical_cast<std::string> prace nad dowolny typ, który można włożyć do std::ostream, w tym z innych typów bibliotek lub własnego kodu.

Zoptymalizowane specjalizacje istnieć dla popularnych typów, z formą generic przypominające:

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; 
} 

może wybrać tę formę wykorzystać większą elastyczność typów wejść w funkcji generycznych lub do wytworzenia std::string od typu, który cię know nie jest podstawowym typem liczbowym.


boost::to_string nie jest bezpośrednio udokumentowany i wydaje się być głównie do użytku wewnętrznego. Jego funkcjonalność zachowuje się jak lexical_cast<std::string>, a nie std::to_string.

-2

jest więcej różnic: boost działa poprawnie! Proszę wziąć pod uwagę następujący kod:

#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

Proszę, zrób coś więcej niż tylko wklejanie kodu. Opisz * co * twój kod robi i * jak * to robi. –

+0

To jest proste wyjście funkcji to_string() i lexical_cast() dla tej samej podwójnej wartości ;-)). –

+0

Te wyniki z pewnością różnią się - i warto to zauważyć. Ale nie jest dla mnie oczywiste, który wynik jest bardziej "właściwy". –

Powiązane problemy