#include #include #include #include #include #include #include namespace fusion=boost::fusion; namespace mpl=boost::mpl; struct Arg1; struct Arg2; template double hf(Seq const& s) { std::cout << fusion::at_key(s) << std::endl; std::cout << fusion::at_key(s) << std::endl; return fusion::at_key(s)+fusion::at_key(s); } template struct ditch_references; template struct ditch_references { typedef fusion::pair type; }; struct foo { typedef double result_type; template double operator()(Seq const& seq)const { //the elements of Seq are reference-qualified! return hf( fusion::result_of::as_map< mpl::transform >::type >::type(seq)); } }; fusion::unfused h; typedef fusion::pair Arg1_t; typedef fusion::pair Arg2_t; int main() { std::cout << h(Arg1_t(123), Arg2_t(321.123)) << std::endl; std::cout << h(Arg2_t(321.123), Arg1_t(123)) << std::endl; }