[boost][lambda] additional placeholders

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

You would (if you already didn't) have to redefine CALL_TEMPLATE_ARGS, CALL_FORMAL_ARGS, and CALL_USE_ARGS macros too. Then it (might) work. The lambda code-base will change significantly with Phoenix-2, so I wouldn't invest too much time on this. In the future there will be support for at least 9 placeholders. Bets, Jaakko Järvi On Nov 17, 2005, at 3:34 PM, Noel Belcourt wrote:
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));
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users

On Nov 17, 2005, at 4:30 PM, Jaakko Jarvi wrote:
Then it (might) work. The lambda code-base will change significantly with Phoenix-2, so I wouldn't invest too much time on this.
In the future there will be support for at least 9 placeholders. ^^^^^^^^^^ Can you say what time frame you're looking at for this?
-- Noel
participants (2)
-
Jaakko Jarvi
-
Noel Belcourt