I have a need to cast a boost::any with an arbitrary contained type to
another type, using a boost::lexical_cast for example.
Consider the following:
#include
class obj
{
public:
int val0;
double val1;
void setval(int i, boost:any const & val)
{
switch (i)
{
case 0: val0 = boost::any_cast<int>(val); break;
case 1: val1 = boost::any_cast<double>(val); break;
}
}
};
int main(int, char*[])
{
obj o;
o.setval(0, 1);
o.setval(1, 2);
return 0;
}
As expected, this throws a boost::bad_any_cast() at runtime. I'd like to
write code similar to (from obj::setval above):
case 0: val0 = boost::lexical_cast<int>(val); break;
case 1: val1 = boost::lexical_cast<double>(val); break;
Unfortunately boost::lexical_cast doesn't handle a parameter of type
boost::any, since there isn't an overload of 'std::ostream operator <<()'
for type boost::any.
Can anyone suggest a simple way around this? My own musings on the subject
have lead me to thinking that there needs to be a simple way to extract the
contained value, or write it to a stream, without knowing its type.
The simplest method I can see would be to add a function to
boost::any::placeholder which either returns a string representation of the
held value or writes the held value to a std::basic_ostream. This should
allow a simple boost::lexical_cast conversion for boost::any to any
arbitrary type.
Comments? Have I missed anything major?
Oh, and yes, I know that this goes beyond the intent of boost::any. I could
easily create my own variant of boost::any which acts in the way I want, but
I think this kind of functionality is useful in a number of cases, so it'd
be nice to have the best solution possible... which is best discussed by the
people here, who are much better versed in the boost library than I :)
--
Corey Murtagh
The Electric Monk
"Quidquid latine dictum sit, altum viditur!"