boost :: mpl :: for_each没有实例化

时间:2014-07-25 10:59:49

标签: c++ boost boost-mpl

采用以下示例,我想知道是否有boost::mpl::for_each的替代方法,它可以在没有任何参数的情况下调用Functor。

#include <boost/mpl/vector.hpp>
#include <boost/mpl/for_each.hpp>

struct EasyFixEngineA { static const char* const name() { return "a"; } };
struct EasyFixEngineB { static const char* const name() { return "b"; } };

struct Registrator {
    // Would prefer a template<class T> void operator()()
    template<class T> void operator()(T t) {
        RegisterInFactory<EasyFixEngine, T> dummy(T::name());
    }
};

// ...
typedef boost::mpl::vector<EasyFixEngineA,EasyFixEngineB> Engines;
boost::mpl::for_each<Engines>(Registrator());

似乎for_each是默认实例化类型。

2 个答案:

答案 0 :(得分:10)

使用boost::typempl::_创建一个MPL lambda,在实例化元素并调用函数之前转换列表中的每个类型,如下所示:

mpl::for_each<Engines, boost::type<mpl::_> >(Registrator());

Registrator应该是这样的:

struct Registrator
{
  template<typename T>
  void operator()(boost::type<T>) const
  {
      RegisterInFactory<EasyFixEngine, T> dummy(T::name());
  }
};

希望有所帮助。

答案 1 :(得分:0)

你应该使用三个参数for_each:

mpl::for_each<Engines,mpl::single_view>(Registrator())

然后您获得的实例将是single_view