Subject: Re: [boost] Checking for return types (result_of) - redux..
From: Steven Watanabe (watanabesj_at_[hidden])
Date: 2009-08-21 12:53:00


AMDG

Edward Grace wrote:
> It seems quite unedifying having to make sure the user adds some,
> apparently arbitrary, magic typedef to their functors in order to make
> sure it works.
>
> My original motivation was to form a helpful compile time assert for
> the user, which I thought would be good practise. It appears all this
> does is to shift a conceptually straightforward problem (make sure
> your functor/function returns something) to an even more obscure one
> "ordinary functions are fine but make sure you define a return_type
> typedef in your functions oh.. and make sure the return type of the
> operator()() is the same as that... " Then I have to add a way of
> sanely catching if they have not done this - I doubt I can... Crazy!
>
> Do you know if, boost::bind and or boost::function etc automatically
> add this typedef?

Yes, they do.

> If so some of the pain (and errors) would be alleviated by the
> automatic typedef. I they don't, perhaps they should.
>
> To make matters worse (rhetorical); if I have a class with a set of
> different functors each with a different return type how can I make
> sure the magic typedef (result_type) is simultaneously correct for each?

In this case, you would need to use the more complex
result template.

struct square {
    template<class Signature>
    struct result;
    template<class This, class T>
    struct result<This(T)> {
        typedef typename boost::remove_const<
            typename boost::remove_reference<T>::type
>::type type;
    };
    template<class T>
    T operator()(const T& t) const { return t * t; }
};

> So, my best solution -- I think -- is to make sure my
> functions/functors are unary and of the form:
>
> void function_body(double return&);
>
> that should be fairly easy to check for in all cases. To users it will
> appears weird in the extreme of course.....

If all you are doing is checking the return type,
you are probly better off using Boost.ConceptCheck.

In Christ,
Steven Watanabe