$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Tim Shead (tshead_at_[hidden])
Date: 2002-04-02 17:28:38
If you have an object whose serialization contains whitespace, say:
class map_coordinates
{
public:
/* Other stuff here */
friend std::ostream& operator<<(std::ostream& Stream, const
map_coordinates& RHS)
{
Stream << RHS.m_latitude << " " << RHS.m_longitude;
return Stream;
}
private:
double m_latitude;
double m_longitude;
};
... and you use boost::lexical_cast to convert it to a string:
extern map_coordinates get_current_position();
widget.set_text("Position: " +
boost::lexical_cast<std::string>(get_current_position));
... you will (correctly) get a bad_lexical_cast exception, because the
extraction operator for the target type (std::string) only extracts
characters up to the first bit of whitespace. Converting objects to
their string representations seems to me to be a common enough scenario
to warrant their own function, such as "string_cast":
// Basically a slight modification of Kevlin Henney's lexical_cast ...
// exception used to indicate runtime string_cast failure
class bad_string_cast : public std::bad_cast
{
public:
virtual const char * what() const throw()
{
return "bad string cast: source type value could not be interpreted
as a string";
}
};
template<typename SourceType>
std::string string_cast(SourceType arg)
{
std::stringstream interpreter;
if(!(interpreter << arg))
throw bad_string_cast();
return interpreter.str();
}
Of course, there's room here for supporting wide strings, etc. Has
anything such as this been considered before?
Timothy M. Shead