c ++ boost mpl / fusion vectors dynamic push_back

时间:2012-03-22 19:06:55

标签: c++ boost template-meta-programming boost-mpl boost-fusion

我是TMP世界的新手,我需要一些关于在boost中使用矢量的帮助 mpl或fusion。

情况就是这样:

我在多线程环境中有一个用于异步函数调用的API 实现为运行时库说: async_call(function_ptr,arg1,arg2,... argN); 函数具有可变数量的参数。

因此,应用程序的代码如下所示:

void funcA(int a){
   // code
}

void funcB(int a, double b, char C){
   // code
}  

int main(){
   int a = 1;
   double b = 2.0;
   char c = 'C';

   async_call(funcA, a);
   async_call(funcB, a,b,c);
}

库将参数值存储在某些内部数据结构中 并在图书馆确定的将来的某个时间执行这些功能。 为了实现一些优化,我需要知道所有可能的 特定应用程序的不同参数数量 并填充包含参数个数的const数组: 所以在编译期间需要填充类似的东西:

const int ArgsNumber[] = {1,3}; 

我已将async_call实现为可变参数模板函数 在内部我计算参数的数量(每个的count_args< ...>) 使用一些模板元编程提交函数

template<typename Tr, typename ...Tn>
void async_call(Tr (*func)(Tn...), Tn... args) {
  // ...
  int args_num = count_args<Tn...>::value;
  // ...
}

以下是问题: 我可以使用count_args&lt; ...&gt;填充全局MPL或FUSION向量吗?结果 然后将其转换为const数组?

我已经看到一些代码提出了boost预处理器来生成const数组 来自像这样的MPL矢量:

#define MACRO(z, i, data) \
mpl::at_c<data,i>::value

static const data[] = { BOOST_PP_ENUM(N, MACRO, argsTable) };

所以我在全球宣布一个mpl矢量:

typedef mpl::vector_c<int> argsTable;

并尝试从async_call函数(从main调用)中推送back_back 像这样:

typedef typename mpl::push_back<argsTable,mpl::int_<count_args<Tn...>::value>>::type xyz;

然而,矢量没有得到更新,因为我必须用push_back返回的新序列以某种方式“更新”argsTable! 我可以这样做吗? MPL是否足够或我需要融合?

非常欢迎任何其他解决方案的建议!

0 个答案:

没有答案