Boost logo

Boost Users :

From: Fernando Cacciola (fernando_cacciola_at_[hidden])
Date: 2005-02-23 12:57:05


"Yuval Ronen" <ronen_yuval_at_[hidden]> escribió en el mensaje
news:cvdm50$36d$1_at_sea.gmane.org...
> Hi.
>
> I checked out the optional library and found it to be of great value. I
> have, however, a few small suggested improvements (and no, I'm not talking
> about the pointer/container/discriminated-union semantics debate; I read
> this discussion in the mail archives and I also saw the resulted library
> and I'm very happy with what came of it).
>
> I'm talking about the detail::none_t part.
>
> Should it really be in the detail namespace? Isn't that a little weird?
> The detail namespace should be "forbidden area" for the users, yet here
> they are offered to write code like
>
> my_optional = boost::detail::none_t();
>
You're definitely right about the fact that users shouldn't been doing that.
At first I thought that you "cheated", like finding yourself the existence
of none_t, but then I look at the documentation and is there as
"detail::none_t"...
This shouldn't appear in the reference!

> One might argue that there's the 'none' global variable which will make
> the code look like
>
> my_optional = boost::none;
>
> which looks much better. I agree that it looks much better, but it still
> doesn't make the previous way of thinking (crating a temporary none_t
> instance) illegal or unsupported. It is unsupported now.
>
Right... users should be allowed to use their own none_t instance the way
you did.

So one clear fix is to move none_t out of the detail namespace.

> And while we're at the global none variable, I have to say that the reason
> I first tried the temporary-none_t-instance way, is that I didn't know of
> 'none'. The documentation is very poor on this subject. It's only
> mentioned in one place in a short, unexplained sentence, and it's in the
> "Detailed Semantics" section which no one ever bothers to read anyway.

Right, so the next fix is to improve the documentation.

>
> In addition to improving the docs, I'd say that it's even better to
> include the boost/none.hpp header with optional.hpp so it could be easily
> found and reached. As I understood, the reason why this is not done now,
> is because some compilers (such as Borland's) have troubles with
> initialized data and pre-compiled headers. If this is truely the case,
> then I think it's easily solved. Include as follows:
>
> #ifndef BOOST_OPTIONAL_DISCLUDE_NONE
> #include <boost/none.hpp>
> #endif
>
> while the BOOST_OPTIONAL_DISCLUDE_NONE flag can be set either by the user,
> or automatically if a troublesome compiler is detected. If Boost.Config
> could automatically detect and set a BOOST_NO_INITIALIZED_DATA flag, then
> the optional library is left with fairly simple code.
>
Well, I'm not sure it is that easy.
Since BOOST_OPTIONAL_DISCLUDE_NONE will be compiler specific, most code will
have to add the counterpart:

#ifdef BOOST_OPTIONAL_DISCLUDE_NONE
#include <boost/none.hpp>
#endif

somewhere else, otherwise none_t will be just equally undefined.

So the "complete" solution seems too contrived to me given that the only
real problem here is just that the documentation is incomplete and users
wanting to use "none" don't have a clue about how to do it.
I believe that with a clear documentation users won't have any problem
including none.hpp manually in just the right place.

> 1. Lift none_t from detail to boost.
OK

> 2. Improve docs wrt 'none' global instance.
OK

> 3. Include none.hpp with optional unless the user/compiler dislikes it.
>
Not so sure ;)

Thank you for the report!

Fernando Cacciola


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net