Boost logo

Boost :

From: Peter Dimov (pdimov_at_[hidden])
Date: 2003-10-11 13:23:48


Brian McNamara wrote:
> On Sat, Oct 11, 2003 at 08:37:24PM +0300, Peter Dimov wrote:
>> Joel de Guzman wrote:
>>
>>> typedef result_of_plus<int, double>::type result;
>>
>> You should name that
>>
>> typedef result_of<plus(int, double)>::type result;
>>
>> instead. :-)
>
> There is a smiley, but seriously, if you did
>
> struct op_plus {
> template <class R> struct result;
> template <class F, class A1, class A2> struct result<F(A1,A2)> {
> typedef typename result_of_plus<A1,A2>::type type;
> };
> };
> // etc.
>
> then
>
> typedef result_of< op_plus(int, double) >::type result;
>
> would truly work. (Names like op_plus are just used as tags which
> stand for the corresponding C++ operators.)

Or even:

struct plus;

template<class A1, class A2> struct result_of<plus(A1, A2)>
{
    // result_of_plus<A1, A2> goes here
};

struct plus
{
    template<class A1, class A2> typename result_of<plus(A1, A2)>::type
        operator()(A1 const & a1, A2 const & a2) { return a1 + a2; }
};

Which one is more "correct" is not clear. It's better to leave result_of
unspecialized if your wonderful TR1 implementation always does the right
thing. It's better to specialize it otherwise, since the nested result<>
forwarding sometimes "breaks" SFINAE.

Let's just hope that one day the proper decltype() will arrive and render
the issue moot.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk