Hi again,

Take 2:

    typedef typename call_traits<T>::param_type 
    ctor_param;

    typedef typename call_traits<typename remove_reference<T>::type>::param_type
    assign_param;

    typedef typename call_traits<T>::reference 
    return_type;

    optional(typename call_traits<T>::param_type arg);
    void reset(assign_param arg);
    return_type operator*();

> I think reset should be:
> 
>     optional<T>::reset ( T const& ) ;
> 
> Following reference assign semantics, an optional reference once bound
> cannot re-bind to another reference. So, we can be able to:
> 
>     int i;
>     optional<int&> opt(i);
>     opt.reset(3); // same as i = 3
> 
> Which is similar to:
> 
>     int i;
>     int& r = i;
>     r = 3; // same as i = 3
> 
> I think this is a big difference of semantics to T*. We can only bind
> an optional reference at construction time. This is an advantage to
> a plain T* because we are assured that no rebinding will take place.
> Thus, I have to disagree that we would never explicitly use optional<T&>.
> I think there's merit in its usage too.
> 
>> the question is, what should be the 'conceptual' signature
>> of these functions? (how should they be documented).
>> 
>> The same goes for operator*().
>> 
>> For non-reference types, it is: T& operator*();
>> but for reference types, is has to be: T operator*();
>> 
>> Anyway, this issues are the same for tuples, so whatever it was
>> done there it can be done with optional<>.
> 
> How about:
> 
>     typedef typename call_traits<T>::param_type ctor_param;
>     typedef typename call_traits<T>::param_type assign_param;
>     typedef typename call_traits<T>::reference return_type;
> 
>     optional<T>::optional(ctor_param arg);
>     optional<T>::reset(assign_param arg);
>     return_type operator*();
> 
> I think that's pretty good documentation in and by itself. It might also be
> a good idea to make the return type part of the public API. Sometimes,
> we want to have temporaries, e.g. to circumvent the function forwarding
> problem. Example:
> 
>     optional<T>::return_type v = *opt;
>     a_func_accepting_a_reference(v);
> 
> Many thanks!

-- 
Joel de Guzman
http://www.boost-consulting.com
http://spirit.sf.net

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to