template <typename … Args>
class D2 : public Base<Args,>…{};使用平行都解包方式,即
先参与其他表达式再解包
D2<X,Y,Z> 相当于 D2: public Base<<X,>>, Base<Y,>, Base<Z,>对于每个传入都参数都会调用unpacker函数处理,不会产生递归调用,每次都是平行的,如图2所示:
template <typename ... T>
void DummyWrapper(T... t){}
template <typename T,typename K=double>
T unpacker(const T& t,K &sum){
//这个函数有多少个参数,就会调用几次
//每次传入一个参数,sum变量是为了带回返回值加的
//如果只是打印参数,则不用sum参数
sum += t;
return t;
}
template <typename T=double, typename... Args>
T Sum(const Args... data){
T sum=0;
DummyWrapper(unpacker(data,sum)...); //直接用unpacker(data)...是非法的
return sum;
}
int _tmain(int argc, _TCHAR* argv[])
{
//fun(1, 2, 3, "hello", 3.1455);
cout << Sum(1, 2, 6.6) << endl;
system("pause");
return 0;
}
底层的unpacker解包函数平行调用,可以看到调用了三次,因为传入的只有三个参数1,2,6.6:


本文深入探讨了C++模板元编程中的一种高效解包技巧,通过平行解包避免了递归调用,实现了对传入参数的并行处理。以D2类为例,展示了如何利用unpacker函数处理参数,并通过Sum函数实现参数求和,最后通过实例验证了方法的有效性。
2710

被折叠的 条评论
为什么被折叠?



