What's the purpose of boost::to_string
(found in boost/exception/to_string.hpp
) and how does it differ from boost::lexical_cast<std::string>
and std::to_string
?
Boost. LexicalCast provides a cast operator, boost::lexical_cast , that can convert numbers from strings to numeric types like int or double and vice versa. boost::lexical_cast is an alternative to functions like std::stoi() , std::stod() , and std::to_string() , which were added to the standard library in C++11.
std::string to_string( long double value ); (9) (since C++11) Converts a numeric value to std::string. 1) Converts a signed integer to a string with the same content as what.
std::to_string Returns a string with the representation of val. The format used is the same that printf would print for the corresponding type: type of val.
std::to_string is no longer a performance disaster as it used to be, at least on integer input. It is still affected by the global locale giving unpredictable results and nondeterministic performance and should generally be avoided but its an interesting development nevertheless.
There are more differences: boost::lexical_cast works a bit different when converting double to string. Please consider the following 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;
}
Results
$ ./to_string
std::to_string(1.79769e+308) == 179769313486231570814527423731704356798070600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
boost::lexical_cast<std::string>(1.79769e+308) == 1.7976931348623157e+308
As you can see, the boost version uses exponential notation (1.7976931348623157e+308) whereas std::to_string prints every digit, and six decimal places. One may be more useful than another for your purposes. I personally find the boost version more readable.
std::to_string
, available since C++11, works on fundamental numeric types specifically. It also has a std::to_wstring
variant.
It is designed to produce the same results that sprintf
would.
You may choose this form to avoid dependencies on external libraries/headers.
The throw-on-failure function boost::lexical_cast<std::string>
and its non-throwing cousin boost::conversion::try_lexical_convert
work on any type that can be inserted into a std::ostream
, including types from other libraries or your own code.
Optimized specializations exist for common types, with the generic form resembling:
template< typename OutType, typename InType >
OutType lexical_cast( const InType & input )
{
// Insert parameter to an iostream
std::stringstream temp_stream;
temp_stream << input;
// Extract output type from the same iostream
OutType output;
temp_stream >> output;
return output;
}
You may choose this form to leverage greater flexibility of input types in generic functions, or to produce a std::string
from a type that you know isn't a fundamental numeric type.
boost::to_string
isn't directly documented, and seems to be for internal use primarily. Its functionality behaves like lexical_cast<std::string>
, not std::to_string
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With