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>?
Jaka jest różnica między std :: to_string, boost :: to_string i boost :: lexical_cast <std::string>?
Odpowiedz
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
.
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
Proszę, zrób coś więcej niż tylko wklejanie kodu. Opisz * co * twój kod robi i * jak * to robi. –
To jest proste wyjście funkcji to_string() i lexical_cast() dla tej samej podwójnej wartości ;-)). –
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". –
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
@Cyber: Proponuję napisać to jako (częściową) odpowiedź. – MikeMB
@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). –