C++ c++;boost mpl/融合向量动态推回

C++ c++;boost mpl/融合向量动态推回,c++,boost,template-meta-programming,boost-mpl,boost-fusion,C++,Boost,Template Meta Programming,Boost Mpl,Boost Fusion,我是TMP世界的新手,我需要一些关于在boost中使用向量的帮助 mpl或融合 因此,情况如下: 我有一个用于在多线程环境中进行异步函数调用的API 作为运行库实现,例如: 异步调用(函数ptr,arg1,arg2,…argN); 函数具有数量可变的参数 因此,应用程序的代码如下所示: void funcA(int a){ // code } void funcB(int a, double b, char C){ // code } int main(){ int a

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

因此,情况如下:

我有一个用于在多线程环境中进行异步函数调用的API 作为运行库实现,例如: 异步调用(函数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 int ArgsNumber[] = {1,3}; 
我已经将async_调用实现为可变模板函数 在内部我计算参数的数量(每个参数的计数参数) 使用一些模板元编程提交函数

template<typename Tr, typename ...Tn>
void async_call(Tr (*func)(Tn...), Tn... args) {
  // ...
  int args_num = count_args<Tn...>::value;
  // ...
}
模板
无效异步调用(Tr(*func)(Tn..Tn..args){
// ...
int args_num=计数_args::值;
// ...
}
问题是: 我可以用count_args结果填充全局MPL或融合向量吗 然后将其转换为常量数组

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

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

static const data[] = { BOOST_PP_ENUM(N, MACRO, argsTable) };
typedef typename mpl::push_back<argsTable,mpl::int_<count_args<Tn...>::value>>::type xyz;
#定义宏(z、i、数据)\
mpl::at_c::value
静态常量数据[]={BOOST_PP_ENUM(N,宏,argsTable)};
因此,我全局声明一个mpl向量:

typedef mpl::vector_c<int> argsTable;
typedefmpl::vector_c argsTable;
并尝试从异步调用函数(从main调用)推回 像这样:

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

static const data[] = { BOOST_PP_ENUM(N, MACRO, argsTable) };
typedef typename mpl::push_back<argsTable,mpl::int_<count_args<Tn...>::value>>::type xyz;
typedef typename mpl::push_back::type xyz;
但是向量没有得到更新,因为我必须用push_back返回的新序列“更新”argsTable! 我可以这样做吗?MPL是否足够,或者我是否需要融合


欢迎对解决方案提出任何其他建议!

您可以使用
sizeof…(Tn)
获取可变数据包中的元素数。最后一点,您想要实现的目标对于使用TMP/预处理器技巧是没有用的。正如您所注意到的,TMP中没有变量。Fusion对此也没有帮助。您实际上无法知道在编译时调用函数的频率(我可能在
if
中,这取决于某个运行时值),因此使用TMP是没有出路的。您是否考虑过立即启动线程并让它休眠,直到它收到通知(可能多次)它应该调用函数?您可以使用
sizeof…(Tn)
获取可变数据包中的元素数。最后一点,您想要实现的目标对于使用TMP/预处理器技巧是没有用的。正如您所注意到的,TMP中没有变量。Fusion对此也没有帮助。您实际上无法知道在编译时调用函数的频率(我可能在
if
中,这取决于某个运行时值),因此使用TMP是没有出路的。您是否考虑过立即启动线程并让它休眠,直到它收到通知(可能多次)它应该调用函数?