C++ c++;boost mpl/融合向量动态推回
我是TMP世界的新手,我需要一些关于在boost中使用向量的帮助 mpl或融合 因此,情况如下: 我有一个用于在多线程环境中进行异步函数调用的API 作为运行库实现,例如: 异步调用(函数ptr,arg1,arg2,…argN); 函数具有数量可变的参数 因此,应用程序的代码如下所示: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
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是没有出路的。您是否考虑过立即启动线程并让它休眠,直到它收到通知(可能多次)它应该调用函数?