采用以下示例,我想知道是否有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
是默认实例化类型。
答案 0 :(得分:10)
使用boost::type
和mpl::_
创建一个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
。