1. 扩展 ( expand)
扩展一个包就是将它分解为构成的元素, 对每个元素应用模式, 获得扩展后的列表。
通过在模式右边放一个省略号(…)来触发扩展操作。当扩展一个包时,我们还要提供用于每个扩展元素的模式(pattern)。
eg. print 函数包含两个扩展
// 扩展 Args templateostream &print(ostream &os, const T const Args&... rest) { os « t « ", ";// 打印第一个实参 return print(os, rest...); // 扩展rest }
对 Args 的扩展中, 编译器将模式 const Arg&应用到模板参数包 Args 中的每个元素。 因此, 此模式的扩展结果是一个逗号分隔的零个或多个类型的列表, 每个类型都形如const types&。
print (cout, i, s, 42); // 包中有两个参数 <=> print (ostream&, const int&, const strings, const int&)//扩展即是:print (os, s, 42);
2. 理解包扩展
支持更复杂的扩展模式
eg. print 调用使用了模式 debug_reg(rest),对函数参数包 rest 中的每个元素调用 debug_rep。扩展结果将是一个逗号分隔的 debug_rep 调用列表。
// 在 print 调用中对每个实参调用 debug_rep templateostream &errorMsg (ostream &os, const Args &... rest) { //print (os, debug_rep (al), debug_rep (a2 ), ..., debug_rep (an) return print (os, debug_rep(rest)...); }
2.1 对的代码
errorMsg (cerr, fcnName, code.num(), otherData, "other", item);
<=>
print (cerr, debug_rep(fcnName), debug_rep(code.num()), debug_rep(otherData), debug_rep ("otherData"), debug_rep(item));
2.2 错的代码
debug_rep函数不是可变参数。
//将包传递给 debug_rep; print(os, debug_rep(al, a2, ...an) print (os, debug_rep (rest...)); //错误:此调用无匹配函数 <=> print (cerr, debug_rep(fcnName, code.num(), otherData, "otherData", item));



