HI,
I'm trying to extend the number of placeholders in boost lambda 1.33.0.
There are three available by default and I need at least one more (_4)
.
I've followed the pattern establish for _3 to define _4, modifying the
following files along the way.
// lambda/core.hpp
boost::lambda::placeholder3_type free3 =
boost::lambda::placeholder3_type();
boost::lambda::placeholder4_type free4 =
boost::lambda::placeholder4_type();
boost::lambda::placeholder3_type& _3 = free3;
boost::lambda::placeholder4_type& _4 = free4;
// lambda/detail/lambda_functors.hpp
template<> struct placeholder<FOURTH> {
template<class SigArgs> struct sig {
typedef typename detail::get_element_or_null_type<3, SigArgs>::type
type;
};
template<class RET, CALL_TEMPLATE_ARGS>
RET call(CALL_FORMAL_ARGS) const { CALL_USE_ARGS; return c; }
};
typedef const lambda_functor<placeholder<THIRD> > placeholder3_type;
typedef const lambda_functor<placeholder<FOURTH> > placeholder4_type;
// lambda/detail/arity_code.hpp
enum { NONE = 0x00, // Notice we are using bits as flags here.
FIRST = 0x01,
SECOND = 0x02,
THIRD = 0x04,
FOURTH = 0x08,
EXCEPTION = 0x10,
RETHROW = 0x20};
So now _4 is defined but I get compilation errors from
boost/function/function_template.hpp when I attempt to use _4. Is
there some change necessary to either lambda placeholders or to boost
function to get it to work correctly?
Thanks,
-- Noel Belcourt
// With the changes above, this code fails with the message below.
#include <boost/function.hpp>
#include <boost/lambda/bind.hpp>
using namespace boost;
using namespace boost::lambda;
typedef function<void (int, int, double, double)> func_t;
template <class T1, class T2, class T3, class T4>
struct A {
template <class R>
A(void (R::*required)(T1, T2, T3, T4), R *r) : u(bind(required, r,
_1, _2, _3, _4)) {}
func_t u;
};
struct B {
void f(int, int, double, double);
};
int main(int, char *[])
{
B b;
A<int, int, double, double> a(&B::f, &b);
return 0;
}
This is the error message from CW 9.6 on Darwin
Error : call of non-function
(point of instantiation: 'main(int, char **)')
(instantiating: 'A<int, int, double, double>::A<B>(void (B::*)(int,
double, double), B *)')
(instantiating: 'boost::function4<void, int, int, double, double,
std::allocator<void>>::function4 `base
constructor'<boost::lambda::lambda_functor<boost::lambda::
lambda_functor_base<boost::lambda::action<6,
boost::lambda::function_action<6, boost::lambda::detail::unspecified>>,
boost::tuples::tuple<void (B::*const )(int, double, double), B *const ,
const boost::lambda::lambda_functor<boost::lambda::placeholder<1>>,
const boost::lambda::lambda_functor<boost::lambda::placeholder<2>>,
const boost::lambda::lambda_functor<boost::lambda::placeholder<4>>,
const boost::lambda::lambda_functor<boost::lambda::placeholder<8>>,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type,
boost::tuples::null_type>>>>(boost::lambda::lambda_functor<boost::
lambda::lambda_functor_base<boost::lambda::action<6,
boost::lambda::function_action<6, boost::lambda::detail::unspecified>>,
boost::tuples::tuple<void (B::*const )(int, double, double), B *const ,
const boost::lambda::lambda_functor<boost::lambda::placeholder<1>>,
const boost::lambda::lambda_functor<boost::lambda::placeholder<2>>,
const boost::lambda::lambda_functor<boost::lambda::placeholder<4>>,
const boost::lambda::lambda_functor<boost::lambda::placeholder<8>>,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type>>>, int)')
(instantiating: 'boost::function4<void, int, int, double, double,
std::allocator<void>>::assign_to<boost::lambda::lambda_functor<boost::
lambda::lambda_functor_base<boost::lambda::action<6,
boost::lambda::function_action<6, boost::lambda::detail::unspecified>>,
boost::tuples::tuple<void (B::*const )(int, double, double), B *const ,
const boost::lambda::lambda_functor<boost::lambda::placeholder<1>>,
const boost::lambda::lambda_functor<boost::lambda::placeholder<2>>,
const boost::lambda::lambda_functor<boost::lambda::placeholder<4>>,
const boost::lambda::lambda_functor<boost::lambda::placeholder<8>>,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type,
boost::tuples::null_type>>>>(boost::lambda::lambda_functor<boost::
lambda::lambda_functor_base<boost::lambda::action<6,
boost::lambda::function_action<6, boost::lambda::detail::unspecified>>,
boost::tuples::tuple<void (B::*const )(int, double, double), B *const ,
const boost::lambda::lambda_functor<boost::lambda::placeholder<1>>,
const boost::lambda::lambda_functor<boost::lambda::placeholder<2>>,
const boost::lambda::lambda_functor<boost::lambda::placeholder<4>>,
const boost::lambda::lambda_functor<boost::lambda::placeholder<8>>,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type>>>)')
(instantiating: 'boost::function4<void, int, int, double, double,
std::allocator<void>>::assign_to<boost::lambda::lambda_functor<boost::
lambda::lambda_functor_base<boost::lambda::action<6,
boost::lambda::function_action<6, boost::lambda::detail::unspecified>>,
boost::tuples::tuple<void (B::*const )(int, double, double), B *const ,
const boost::lambda::lambda_functor<boost::lambda::placeholder<1>>,
const boost::lambda::lambda_functor<boost::lambda::placeholder<2>>,
const boost::lambda::lambda_functor<boost::lambda::placeholder<4>>,
const boost::lambda::lambda_functor<boost::lambda::placeholder<8>>,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type,
boost::tuples::null_type>>>>(boost::lambda::lambda_functor<boost::
lambda::lambda_functor_base<boost::lambda::action<6,
boost::lambda::function_action<6, boost::lambda::detail::unspecified>>,
boost::tuples::tuple<void (B::*const )(int, double, double), B *const ,
const boost::lambda::lambda_functor<boost::lambda::placeholder<1>>,
const boost::lambda::lambda_functor<boost::lambda::placeholder<2>>,
const boost::lambda::lambda_functor<boost::lambda::placeholder<4>>,
const boost::lambda::lambda_functor<boost::lambda::placeholder<8>>,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type>>>,
boost::detail::function::function_obj_tag)')
(instantiating:
'boost::detail::function::void_function_obj_invoker4<boost::lambda::
lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::
action<6, boost::lambda::function_action<6,
boost::lambda::detail::unspecified>>, boost::tuples::tuple<void
(B::*const )(int, double, double), B *const , const
boost::lambda::lambda_functor<boost::lambda::placeholder<1>>, const
boost::lambda::lambda_functor<boost::lambda::placeholder<2>>, const
boost::lambda::lambda_functor<boost::lambda::placeholder<4>>, const
boost::lambda::lambda_functor<boost::lambda::placeholder<8>>,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type>>>, void, int, int,
double, double>::invoke(boost::detail::function::any_pointer, int, int,
double, double)')
function_template.hpp line 136
BOOST_FUNCTION_RETURN((*f)(BOOST_FUNCTION_ARGS));
Error : call of non-function
(instantiating:
'boost::detail::function::void_function_obj_invoker4<boost::lambda::
lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::
action<6, boost::lambda::function_action<6,
boost::lambda::detail::unspecified>>, boost::tuples::tuple<void
(B::*const )(int, double, double), B *const , const
boost::lambda::lambda_functor<boost::lambda::placeholder<1>>, const
boost::lambda::lambda_functor<boost::lambda::placeholder<2>>, const
boost::lambda::lambda_functor<boost::lambda::placeholder<4>>, const
boost::lambda::lambda_functor<boost::lambda::placeholder<8>>,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type>>>, void, int, int,
double, double>::invoke(boost::detail::function::any_pointer, int, int,
double, double)')
function_template.hpp line 136
BOOST_FUNCTION_RETURN((*f)(BOOST_FUNCTION_ARGS));