"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

Reply via email to