"Dirk Gerrits" <[EMAIL PROTECTED]> wrote in message
arjgo5$o25$[EMAIL PROTECTED]">news:arjgo5$o25$[EMAIL PROTECTED]...
> Fernando Cacciola wrote:
>
> [snip]
>
> > void recieve_async_message()
> > {
> > optional rcv ;
> > while ( !!(rcv = get_async_input()) && !timeout() )
> > output(*rcv);
> > }
>
> [snip]
>
> Maybe it's a minor point, but I think the !! is really ugly. Have you
> considered the safe_bool idiom that's used in some other Boost
> libraries? (smart_ptr to name one.)
>
Yes, I did.
safe_bool (among other alternatives) was rejected because of the following
(this specific point is explained in detail on the documentation)
void foo()
{
optional<bool> opt = get_some();
bool is_it = opt;
}
What is the intention of 'is_it'?
Does it refer to the 'value' of 'opt', or to its initialized state?
The problem is that safe_bool allows for a conversion to bool in certain
contexts, but this violates the design premise that there is no implicit
conversion from optional<T> to T for the case when T=bool.
With the current design, the above will fail to compile, requiring the user
to disambiguate the meaning by choosing either:
bool is_it_initialized = !!opt;
bool is_it_true = *opt ;
For similar reasons, the following is not supported either:
if ( opt == 0 ) or if ( opt != 0 )
But if you really dislike the syntax, there is an alternative spelling:
if ( peek(opt) ) ....
peek() returns a pointer to the optional value if it is initialized, or NULL
if it isn't. Such a pointer can be directly used in a boolean context with
the expected meaning.
--
Fernando Cacciola
_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost