栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ Primer 5th笔记(chap 16 模板和泛型编程)包扩展

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ Primer 5th笔记(chap 16 模板和泛型编程)包扩展

1. 扩展 ( expand)

扩展一个包就是将它分解为构成的元素, 对每个元素应用模式, 获得扩展后的列表。

通过在模式右边放一个省略号(…)来触发扩展操作。当扩展一个包时,我们还要提供用于每个扩展元素的模式(pattern)。

eg. print 函数包含两个扩展

// 扩展 Args
template ostream &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
template  ostream &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));
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/302386.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号