
hello, here's what I'm trying to do: *.cpp //result_type() not valid typedef fusion::vector<A,B,C> result_type; //arg2s_type() is valid typedef fusion::vector<Arg2A,Arg2B,Arg2C> arg2s_type; //transforms // (fusion::vector<identity<A>,identity<B>,identity<C> >(),arg2s_type()) // into {A(arg1,Arg2A()),B(arg1,Arg2B()),C(arg1,Arg2C()))} result_type result( range<result_type,args2_type>::create( arg1 //arbitrary type Arg1 ) ); here's my attempt. problems/questions are shown in comments. *.hpp: template<template<typename> class metafun = mpl::identity> struct apply_wrapper{ template<typename T> struct apply{ typedef metafun<T> type; }; }; template<typename Seq,template<typename> class metafun = mpl::identity> struct apply_wrapper_to_seq{ typedef typename mpl::transform< Seq, // e.g. fusion::vector<A,B,C> apply_wrapper<metafun>
::type type; //e.g. fusion::vector<identity<A>,identity<B>,identity<C> > };
template<typename Arg1> struct fun{ fun(const Arg1& args):args_(args_){} //copy, assign... // probably not what result_of::transform expects, based on compile // errors (below) template<typename Metafun,typename Arg2> struct result{ typedef typename Metafun::type type; }; template<typename Metafun,typename Arg2> typename Metafun::type //e.g Metafun = identity<A> operator()(const Metafun& meta,const Arg2& arg2)const{ typedef typename Metafun::type result_type; //e.g. A return result_type(args,arg2); } const Arg1& args_; }; template<typename Result,typename Arg2s> struct range{ //e.g. fusion<identity<A>,identity<B>,identity<C> > typedef typename apply_wrapper_to_seq<Result>::type wrappers_type; //e.g. fusion::vector<Arg2A,Arg2B,Arg2C> typedef Arg2s arg2s_type; template<typename Arg1> struct result{ typedef typename fusion::result_of::transform< wrappers_type, arg2s_type, fun<Arg1>
::type type; };
template<typename Arg1> static typename result<Arg1>::type create(const Arg1& args){ typedef fun<Arg1> f_type; wrappers_type wrappers; arg2s_type arg2s; f_type f(args); BOOST_MPL_ASSERT( ( mpl::equal< Result, typename result<Arg1>::type > ) );//result_of::fun causes compile error /usr/local/boost_1_35_0/boost/utility/result_of.hpp|34|instantiated from ‘boost::detail::result_of_impl< factory::fun<Arg1>, factory::fun<Arg1> > ()(boost::mpl::identity<A>, Arg2A), false>’| ... //usr/local/boost_1_35_0/boost/utility/result_of.hpp|68|error: wrong number of template arguments (1, should be 2)| //factory/range.hpp|32|error: provided for ‘template<class Arg1> template<class Metafun, class Arg2> struct factory::fun<Arg1>::result’| //usr/local/boost_1_35_0/boost/fusion/view/transform_view/detail/value_of_impl.hpp|55|error: no type named ‘type’ in ‘struct //boost::mpl::apply<boost::fusion::detail::apply_transform_result<factory::fun<Arg1>, boost::mpl::identity<A>, Arg2A, mpl_::na, mpl_::na, mpl_::na>’| return fusion::transform( wrappers, arg2s, f ); } }; any help would appreciated. thanks!