From: Steven Watanabe (watanabesj_at_[hidden])
Date: 2007-08-21 14:35:58


AMDG

Sorry about responding to a digest. Gmane is down.

Alexander Nasonov wrote:

>
> How about this?
>
> int BOOST_LOCAL_FUNCTION( (v) ) (int i)
> {
> return v = i;
> } BOOST_LOCAL_FUNCTION_END
>
> <snip>

Nice way to handle the return type.

You would need a base class and dynamic allocation right?
Also, I need to be able to specify the name of the function somehow
and I am not sure how this can be accomplished with that interface.
Here's what I have right now:

template<class Tuple, class F>
struct local_function;

#define BOOST_LOCAL_FUNCTION_DEF(z, n, data)\
    template<class Tuple class R BOOST_PP_ENUM_TRAILING_PARAMS_Z(z, n,
class T)>\
    struct local_function<Tuple, R(BOOST_PP_ENUM_PARAMS_Z(z, n, T))> {\
        Tuple tuple;\
        R (*f)(BOOST_PP_ENUM_TRAILING_PARAMS_Z(z, n, T));\
        local_function(const Tuple& t) : tuple(t) {}\
        R operator()(BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_Z(z, n, T, t)) {\
            return(f(tuple BOOST_PP_ENUM_SHIFTED_TRAILING_PARAMS_Z(z, n,
t)))\
        }\
    };

BOOST_PP_REPEAT(BOOST_PP_INC(BOOST_LOCAL_FUNCTION_MAX_ARITY),
BOOST_LOCAL_FUNCTION_DEF, ~)

So that

int BOOST_LOCAL_FUNCTION(name, (i)(j), (int x)(int y)) {
    //body here
} BOOST_LOCAL_FUNCTION_END

expands to

int result_tag;
typedef BOOST_TYPEOF(result_tag) result_type;
typedef BOOST_TYPEOF(i) type_0;
typedef BOOST_TYPEOF(j) type_1;
typedef boost::tuple<type_0, type_1> tuple_type;
typedef local_function<tuple_type, result_type(tuple_type, int x, int
y)> function_type;
function_type name(make_tuple(i, j));
{
    function_type* function_ptr = &name;
    struct body {
        result_type impl(tuple_type& args, int x, int y) {
            type_0& i = boost::get<0>(args);
            type_1 j = boost::get<1>(args);
            {
                //body here
            }
        }
    };
    function_ptr->f = &body::impl;
}

Note that i and j are passed by value rather than by reference. Otherwise,
it is not safe to have a copy of the function around after control
leaves the scope
it is defined in.

In Christ,
Steven Watanabe