$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Tom Widmer (tom_usenet_at_[hidden])
Date: 2005-01-26 13:18:49
Sérgio Vale e Pace wrote:
> Jonathan Turkanis wrote:
>>Two comments, though:
>>
>>1. Your code breaks boost::any for use with non-OutputStreamable types.
>
>
> that´s the odd part it didn´t. as long I don´t use the insert operator
> i works fine and I don´t understant why it don´t break. see:
>
> class A {};
>
> void foo() {
> A a; int b=0; any x;
> x = b;
> cout << x;
> b = any_cast<int>(x);
>
> x = a;
> // cout << x; // as long as this line is commented everything works fine
> a = any_cast<A>(x);
> }
>
> on the other hand if I do invoke the insert operator (<<) on a
> non-OutputStreamable type I get a stack overflow also I don´t
> understand why.
Anything is convertible to boost::any, and since you have an operator<<
for boost::any, it will catch any object that doesn't have a better
matched operator<< (i.e. any one that doesn't require a user defined
conversion). If this didn't happen, you'd just get a compiler error when
you tried to create an any<A>, since creation of that requires
instantiation of all virtual functions of holder<A>, including the
ill-formed print member (e.g. no overload matches the call out<<held).
Dispatching to some kind of default call (which might just set failbit
on the stream, or you could make it configurable) is probably the best
way to handle this.
Tom