Anthony Williams wrote: > Aleksey Gurtovoy writes: > > > > The following is a sketch of a potential use case for the > > newly-accepted and already very useful 'optional' class. > > > > Suppose you have a pure RAII guard/locker which unconditionally > > does its job: > > > > struct RAII_lock > > : boost::noncopyable > > { > > RAII_lock(entity& e); > > ~RAII_lock(); > > }; > > > > and you want to write a semantic equivalent to the following > > > > boost::scoped_ptr<RAII_lock> lock( cond ? new RAII_lock(entity) : 0 ); > > // ... > > > > expect for the dynamic allocation part. How would you do it? > > > > IMO the following seems only natural: > > > > boost::optional<RAII_lock> lock( cond, entity ); > > // ... > > > > The only problem with the above is that currently you cannot > > write something like this. It would be nice if we could, IMO. > > > > Thoughts? > > * Firstly, this would require optional to be able hold > non-copy-constructible types, whereas the current requirement > say "T must be CopyConstructible". > > You could drop the "CopyConstructible" requirement if you said that > boost::optional<T> is only itself CopyConstructible/Assignable/ > Swappable if T is CopyConstructible.
Yep, that's what I would argue for. > However, this leaves the > question of how to get the value in there in the first place; the > answer to which is ... > > * Secondly, you would need a templated constructor to allow T > to be constructed using another type. Correct, that's what I am hoping to pursue :). > > Or you could initialize it with optional<EntityType>, since > this template constructor does already exist, and already does > the "right thing". Hmm, that's an interesting idea. In my case, 'entity' is already exist, though, (and is noncopyable itself) so it should be 'optional<EntityType&>' instead. Still interesting. But, of course, that still wouldn't work with the current 'optional' (for one, operators * and -> would have a reference-to-reference problem). If the CopyConstructible requirement is changed as outlined the above, it should though, shouldn't it? Fernando? > > * Thirdly, you would need a special custom constructor which > takes a conditional. Yep. I think it's entirely reasonable. After all, 'optional' does have a bool inside itself, and the conditional is going to map into that one directly. > > You could get round it like below: > > boost::optional<EntityType> optionalEntity; > if(cond) > optionalEntity.reset(entity); > > // if optionalEntity is not initialized, neither is lock > // else lock is constructed using the conversion constructor > boost::optional<RAII_lock> lock(optionalEntity); > > You can do this with the current implementation, since the > CopyConstructible requirement isn't actually verified with a concept > check, but you'd have to get the requirement dropped if you were to > rely on it I could if not the reference-to-reference problem, but thanks for the suggestion. > (which would probably mean implementing templated > constructor/reset/operator= to avoid _having_ to use an optional<U> > to initialize your optional<T>) Yes, I would prefer the use case to be supported with the minimal verboseness on the user side. Otherwise I might as well write 'optional_lock' with the required semantics - which is an option. Aleksey _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost