2

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

所以情况如下:

我在多线程环境中有一个用于异步函数调用的 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<...> 结果填充全局 MPL 或 FUSION 向量,然后将其转换为 const 数组吗?

我已经看到一些代码建议使用 boost 预处理器从 MPL 向量生成 const 数组,如下所示:

#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 调用)中 push_back,如下所示:

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

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

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

4

0 回答 0