我是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是否足够或我需要融合?
非常欢迎任何其他解决方案的建议!