2015-04-01 9 views
15

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>?

+9

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

+0

@Cyber: Suggerisco di scrivere questo come risposta (parziale). – MikeMB

+0

@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). –

risposta

21

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.

-2

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 
+2

Si prega di fare un po 'di più che semplicemente incollare del codice. Descrivi * cosa * fa il tuo codice e * come * lo fa. –

+0

E 'semplice l'output di to_string() e lexical_cast() per lo stesso doppio valore ;-)) –

+0

Questi risultati sono sicuramente diversi - e vale la pena notare. Ma non è ovvio per me quale risultato sia più "giusto". –