
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));