Iain K.Hanson wrote: > I'm having a problem using fold with the example from the reference > page. I can get the following example from copy to comile as fold > > namespace mpl = boost::mpl; > using mpl::_; > > typedef mpl::vector10_c<int,9,8,7,6,5,4,3,2,1,0> answer; > > typedef mpl::fold< > mpl::range_c<int,0,10> > , mpl::vector<> > , mpl::push_front<_,_> > >::type result; > > BOOST_STATIC_ASSERT(mpl::size<result>::value == 10); > BOOST_STATIC_ASSERT((mpl::equal< result,answer >::type::value)); > > > but this won't: > > > namespace mpl = boost::mpl; > using mpl::_1; > using mpl::_2; > > typedef > mpl::vector<long,float,short,double,float,long,long double> > types; > > typedef mpl::fold< > types > , mpl::integral_c<long, 0> > , mpl::if_< boost::is_float<_2>, mpl::next<_1>,_1 > > >::type number_of_floats; > > typedef mpl::lambda< number_of_floats >::type func;
Just a quibble - the above line is unnecessary. > > BOOST_STATIC_ASSERT(( number_of_floats::value == 3 )); ^^^ An error in the docs, should be 4. Sorry! > > I presume that the problem is here > > , mpl::if_< boost::is_float<_2>, mpl::next<_1>,_1 > > ^^^^^^^^^^^^^^^^^^^ > > as this is a non-mpl metafunction. Actually, it is! Try this one: typedef lambda< boost::is_float<_1> >::type is_float; typedef apply1< is_float, float >::type res; BOOST_STATIC_ASSERT(res::value == true); > Can any one tell me how to fix the above please? BOOST_STATIC_ASSERT(number_of_floats::value == 4); Fixed in the reference docs' sources, too. > > Also, what are the requirement on a metafunction to be used with > lambda. A simple example would be useful. On a conforming compiler, the simple form (http://www.mywikinet.com/mpl/paper/mpl_paper.html#metafunctions.simple) template< typename T1, ..., typename Tn > struct f { typedef ... type; }; just works "out-of-box": template< typename T > struct identity { typedef T type; }; typedef lambda< identity<_1> >::type f; typedef apply1< f, int >::type res; BOOST_MPL_ASSERT_IS_SAME(res, int); HTH, Aleksey _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost