$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
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