当前位置: 首页 > news >正文

外贸网站推广计划书软文营销

外贸网站推广计划书,软文营销,做简单网站的步骤,做维修电器网站16.3 重载与模板 函数模板可以被另一个模板或一个普通分模板函数重载。与往常一样,名字相同的函数必须具有不同数量或类型的参数(这样才可以完成重载)。 如果设计模板,则函数的匹配规则与普通函数的重载有所不同,具体…

16.3 重载与模板

函数模板可以被另一个模板或一个普通分模板函数重载。与往常一样,名字相同的函数必须具有不同数量或类型的参数(这样才可以完成重载)。

如果设计模板,则函数的匹配规则与普通函数的重载有所不同,具体来说,当涉及模板时:

  • 对于一个调用,其候选函数包括所有模板实参推断成功的函数模板实例
  • 候选的函数模板总是可行的,因为模板实参推断会排除任何不可行的模板;
  • 与往常一样,可行函数(模板与非模板)按类型转换(如果对此调用需要的话)来排序;
  • 与往常一样,如果恰有一个函数提供比任何其它函数都更好的匹配,则选择此函数。如果出现多个匹配,则选择更好的那一个。如果有多个更好的,则此调用有歧义。

编写重载模板

下例构造一组函数,命名为 debug_rep,每个函数返回一个给定对象的 string 表示。

首先编写该函数最通用的版本,将它定义为一个模板,接受一个 const 对象的引用:

template <typename T> string debug_rep(const T &t) {ostringstream ret;ret << t;return ret.str();
}

接下来定义打印指针的 debug_rep 版本:

template <typename T> string debug_rep(T *p) {ostringstream ret;ret << "pointer: " << p;	// 打印指针的值if(p) {ret << " " << debug_rep(*p);	// 打印 p 指向的值	} else {ret << "null pointer";			// 或打印为空指针}return ret.str();
}

调用上述的两个函数:

string s("hi!");
cout << debug_rep(s) << endl;	// 调用第一个版本的 debug_rep, 实参是 string
cout << debug_rep(&s) << endl;	// 调用第二个版本的 debug_rep, 实参是 string*

对于第二个函数调用,编译器将会生成两种版本的模板函数实例,实际上,第二个函数调用可以与上述两个模板函数都进行绑定,实例化的结果如下:

debug_rep(const string*&);	// 由第一个版本的 debug_rep 实例化而来, T 被绑定到 string*
debug_rep(string*);			// 由第二个版本的 debug_rep 实例化而来, T 被绑定到 string

第二个实例化的结果是第二个函数调用的精准匹配。

多个可行模板

另一个例子进行如下调用:

const string *sp = &s;
cout << debug_rep(sp) << endl;

对于这个例子,上述两个版本的模板都是可行的,而且两个都是精准匹配。

在此情况下,正常的函数匹配规则无法区分这两个函数,但根据重载函数模板的特殊规则,此调用被解析为debug_rep(T*),即:更特例化的版本。debug_rep(const T&)本质上适用于任何类型,包括指针类型,它比debug_rep(T*)更加通用,后者只能由于指针类型。因此,用自己的话说就是,重载模板匹配的规则大概可以概括为,当存在多个适配的函数匹配时,选择最不通用,最没有歧义,最匹配的那一个

非模板和模板重载

这个例子定义一个普通非模板的 debug_rep 来打印双引号包围的 string:

string debug_rep(const string &s) {return '"' + s + '"';
}

调用时:

string s("hi!");
cout << debug_rep(s) << endl;

有两个同样好的可行函数:

debug_rep<string>(const string&);	// 第一个模板, T 绑定到 string*
debug_rep(const string&);			// 普通非模板函数

显然,二者提供相同的参数列表,可以认为二者提供同样好的匹配。但是,根据编译器的规则,它将会选择非模板的版本进行匹配。当存在多个同样好的函数模板时,编译器选择最特例化的版本,处于同样的原因,一个非模板会比一个函数模板更好。

重载模板和类型转换

对于 C 风格字符串指针以及字符串字面常量,考虑如下调用:

cout << debug_rep("hi world!") << endl;	// 调用 debug_rep(T*)

本例中所有三个 debug_rep 都是可行的:

debug_rep(const T&);		// T 绑定到 char[10]
debug_rep(T*);				// T 绑定到 const char
debug_rep(const string&);	// 要求从 const char* 到 string 的类型转换

对于给定的实参,两个模板都提供精确匹配——第二个模板需要进行一次(许可的)数组到指针的转换,而对于函数匹配来说,这种转换被认为是精确匹配。非模板版本是可行的,但需要进行一次用户定义的类型转换。与之前一样,T*版本更加特例化,编译器会选择它。

如果我们希望字符指针按照 string 处理,可以定义另外两个非模板重载版本:

string debug_rep(char *p) {return debug_rep(string(p));
}
string debug_rep(const char *p) {return debug_rep(string(p));
}

缺少声明可能导致程序行为异常

值得注意的是,为了使 char * 版本的 debug_rep 正确工作,在定义此版本时,debug_rep(const string&)的声明必须在作用域中。否则,就有可能调用错误的 debug_rep 版本,比如模板实例化的版本:

template<typename T> string debug_rep(const T &t);
template<typename T> string debug_rep(T *p);
string debug_rep(const string&);
string debug_rep(char *p) {// 如果第三个函数声明不在当前作用域中, 那么下面的 debug_rep 将调用 debug_rep(const T&)实例化的版本return debug_rep(string(p));
}

在定义任何函数之前,记得声明所有重载的函数版本。这样就不用担心编译器由于未遇到你希望调用的函数而实例化一个并非你需要的版本。

http://www.tj-hxxt.cn/news/45373.html

相关文章:

  • 如何查一个网站的备案号一站式发稿平台
  • 网站建设需要学习课程自己开发网站
  • 济南商城网站建设多少钱湛江seo网站管理
  • 安丘市住房和城乡建设局网站临沂google推广
  • wordpress 禁用 提示360优化大师官方版
  • 怎么用flash做游戏下载网站福州百度推广排名优化
  • 小企业网站建设服务免费个人博客网站
  • 建设网站的风险百度检索入口
  • 做一组静态页面网站多少钱竞价推广出价多少合适
  • 设计之窗提升关键词排名seo软件
  • 短视频营销概念北京搜索引擎优化主管
  • 浙江政府网站建设指南短视频询盘获客系统
  • 梓潼销售网站建设哪家专业厦门网站推广优化哪家好
  • 自定义网站建设团队百度seo优化培训
  • 网站转app工具高级版深圳网络营销和推广渠道
  • 网页设计实训报告3篇上海有哪些优化网站推广公司
  • 真人性做爰免费网站网站建设方案
  • c2c网站的功能软件推广怎么赚钱
  • 网站设计制作的价格低廉网络营销和电子商务区别
  • 网站管理员招聘营销推广方法有哪些
  • 长治做网站多少钱今日热点新闻事件摘抄
  • 长沙自助建站哪家好东莞百度seo关键词优化
  • 租房网站的财务分析表怎么做东莞百度搜索网站排名
  • 网站集约化建设工作总结超级外链工具 增加外链中
  • 蛋糕网站制作答辩seo搜索引擎
  • 如何在分类信息网站做推广seo的搜索排名影响因素有哪些
  • 搭建网站空间上海网站seo外包
  • 手机网站域名解析艾瑞指数
  • 网站开发工具大全短视频排名seo
  • 网站建设专业毕业论文营销推广seo