2011-04-21 68 views
2
std::string a= "a"; 
std::string b= "b"; 
std::string c= "c"; 

typedef mpl::vector<EasyFixEngineA,EasyFixEngineB,EasyFixEngineC> vecType; 

RegisterInFactory<EasyFixEngine, mpl::at_c<vecType,0>::type> registerA(a); 
RegisterInFactory<EasyFixEngine, mpl::at_c<vecType,1>::type,> registerB(b); 
RegisterInFactory<EasyFixEngine, mpl::at_c<vecType,2>::type> registerC(c); 

如何使用boost :: mpl自动生成最后3行? 通过自动我的意思是不必重复3次“相同”行从boost mpl载体注册类型

+0

对不起,我编辑了 – Guillaume07 2011-04-21 09:22:15

回答

2

一种可能利用mpl::for_each

#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 { 
    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()); 

如果T的实例是不适合你的情况,看this question

+1

我不能在这里使用lambda表达式而不是函子吗? – Guillaume07 2011-04-23 09:56:30

+1

@Guillaume:你不能模板lambdas,所以你需要使用一个带有模板成员或模板函数的函子来从'for_each'获取实际的类型。 – 2011-04-23 15:36:41

+0

@GeorgFritzsche不再真实,C++ 14添加了通用lambdas – CoffeeandCode 2014-10-31 04:22:05

1

很简短的答案是,你不能。

确实有三件事情: - 编译时执行(也就是元编程),这是用MPL完成的。他们只在类型定义 工作 - 运行时执行(也就是通常的节目。),它是纯C++(在这一点上所有的类型定义) - 变量声明

您想使用MPL(编译时)生成一些C++代码(变量声明)并执行一些运行时(变量初始化)。

也许你想看看boost :: fusion(融合意味着结合编译时和运行时操作)。 如果你在boost :: fusion中声明了你的三个变量,并且你还有三个字符串,那么你可以使用boost :: fusion :: transform。但我不知道这是否是你想要的