Qual è lo scopo di boost::to_string
(trovato in boost/exception/to_string.hpp
) e in cosa differisce da boost::lexical_cast<std::string>
e std::to_string
?Qual è la differenza tra std :: to_string, boost :: to_string e boost :: lexical_cast <std::string>?
Qual è la differenza tra std :: to_string, boost :: to_string e boost :: lexical_cast <std::string>?
risposta
std::to_string
, disponibile da C++ 11, funziona su tipi numerici fondamentali in particolare. Ha anche una variante std::to_wstring
.
È progettato per produrre gli stessi risultati di std::sprintf
.
È possibile selezionare questo modulo per evitare dipendenze da librerie/intestazioni esterne.
boost::lexical_cast<std::string>
opere qualsiasi tipo che può essere inserito in un std::ostream
, compresi i tipi provenienti da altre biblioteche o il proprio codice. Esistono
specializzazioni Ottimizzato per i tipi più comuni, con la forma generica simile:
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;
}
si può scegliere questa forma di sfruttare una maggiore flessibilità dei tipi di ingresso a funzioni generiche, o per produrre una std::string
da un tipo che si sapere non è un tipo numerico fondamentale.
boost::to_string
non è direttamente documentato, e sembra essere per uso interno in primo luogo. La sua funzionalità si comporta come lexical_cast<std::string>
, non std::to_string
.
ci sono più differenze: boost funziona bene! Si prega di prendere in considerazione il seguente codice:
#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
Si prega di fare un po 'di più che semplicemente incollare del codice. Descrivi * cosa * fa il tuo codice e * come * lo fa. –
E 'semplice l'output di to_string() e lexical_cast() per lo stesso doppio valore ;-)) –
Questi risultati sono sicuramente diversi - e vale la pena notare. Ma non è ovvio per me quale risultato sia più "giusto". –
Se richiamo la cronologia correttamente, 'boost :: to_string' ha preceduto' std :: to_string', come avviene di solito. La spinta tende ad essere il terreno di gioco per le cose prima che venga accettata nella libreria standard. 'std :: to_string' è nuovo a partire da C++ 11. – CoryKramer
@Cyber: Suggerisco di scrivere questo come risposta (parziale). – MikeMB
@CoryKramer, 'boost :: to_string' potrebbe essere più vecchio, ma non è lo stesso di' std :: to_string' e 'std :: to_string' non era basato su di esso (semplicemente capita di usare lo stesso nome). –