
I want to call a functor for each type in a type list. Consider the following program. #include <iostream> #include <boost/mpl/apply.hpp> #include <boost/mpl/empty_base.hpp> #include <boost/mpl/fold.hpp> #include <boost/mpl/identity.hpp> #include <boost/mpl/inherit.hpp> #include <boost/mpl/joint_view.hpp> #include <boost/mpl/lambda.hpp> #include <boost/mpl/pair.hpp> #include <boost/mpl/transform.hpp> #include <boost/mpl/vector.hpp> template <typename T, typename Functor> class functor_list_member { public: functor_list_member() { Functor f; f.template operator()<T>(); } }; template<typename Sequence, typename Functor> class functor_list: private boost::mpl::fold< Sequence, boost::mpl::empty_base, boost::mpl::inherit< boost::mpl::_1, functor_list_member<boost::mpl::_2, Functor> >
::type {};
typedef boost::mpl::vector<bool, char, short, int, long, float, double> types; struct functor { template <typename T> void operator()() { std::cout << __PRETTY_FUNCTION__ << std::endl; } }; typedef functor_list<types, functor> my_functor_list; int main(int argc, char* argv) { my_functor_list(); } The program outputs void functor::operator()() [with T = bool] void functor::operator()() [with T = char] void functor::operator()() [with T = short int] void functor::operator()() [with T = int] void functor::operator()() [with T = long int] void functor::operator()() [with T = float] void functor::operator()() [with T = double] However, I want to create a functor object first, and pass it to each functor_list_member, like this: template <typename T, typename Functor> class functor_list_member { public: functor_list_member(Functor f) { f.template operator()<T>(); } }; template<typename Sequence, typename Functor> class functor_list: private boost::mpl::fold< Sequence, boost::mpl::empty_base, boost::mpl::inherit< boost::mpl::_1, functor_list_member<boost::mpl::_2, Functor> >
::type { public: functor_list(Functor f) /* how do I call base(f) ? */ { } };
typedef boost::mpl::vector<bool, char, short, int, long, float, double> types; struct functor { template <typename T> void operator()() { std::cout << __PRETTY_FUNCTION__ << std::endl; } }; typedef functor_list<types, functor> my_functor_list; int main(int argc, char* argv) { functor f; my_functor_list(f); } but I do not know how to call the constructor of the base class in functor_list::functor_list(Functor f). (see comment /* how do I call base(f) ? */). Can someone help me? Best regards, -- Ares Lagae Computer Graphics Research Group, Katholieke Universiteit Leuven http://www.cs.kuleuven.be/~ares/