Hey, I have problems using mpl::for_each. Well, it works for simple functors, but i need a functor with some context. I'm trying to build a functor through boost::bind. mpl::_1 should be a type from the consensus sequence if evaluated, shouldn't it? You can see a small (hopefully not too small) example below. Kind Regards Manuel class filter{ //[..] // "In" and "Out" are fusion::maps template< typename T > inline const boost::promise_stream<T>& get_promise(){ return fusion::at_key< T >(Out); }; template< typename T > inline void connect(const boost::promise_stream<T> &promise){ fusion::at_key< T >(In).reset(new boost::future_stream< T >(promise)); }; template< typename producer_type > void connect(producer_type Producer){ //[..] // "consensus" is a mpl sequence. mpl::for_each< consensus >(boost::bind(&producer_type::connect, Producer, get_promise< mpl::_1 >())); };
AMDG Manuel Jung wrote:
Hey,
I have problems using mpl::for_each. Well, it works for simple functors, but i need a functor with some context. I'm trying to build a functor through boost::bind. mpl::_1 should be a type from the consensus sequence if evaluated, shouldn't it? You can see a small (hopefully not too small) example below.
mpl::_1 is not expanded by Boost.Bind. You need something like
template<class T>
struct wrap {};
struct connect_f {
typedef void result_type;
template
2008/10/6 Steven Watanabe
template<class T> struct wrap {};
struct connect_f { typedef void result_type; template
void operator()(Producer* producer, Self* self, const wrap<T>&) const { producer->connect(self->get_promise<T>()); } }; ...
boost::mpl::for_each
mpl::_1 >(boost::bind(connect_f, &Producer, this, _1));
You can use boost::mpl::make_identity instead of wrap. Roman.
participants (3)
-
Manuel Jung
-
Roman Perepelitsa
-
Steven Watanabe