C++.Templates学习总结归纳1

函数模板

首先我们来看看函数模板,一个函数模板(function template)代表一族函数,其表现和一般的函数一样,只是其中的某些元素在编写的时候还不知道,也就是说这些还不知道的元素,我们将其参数化了。

例如下面的返回两个数中的较大者:

template<class T>
inline T const& max(T const& a,T const& b){return a>b?a:b;
}

当然,上述代码中的class也可以用typename所代替,但是不能使用struct代替。不过一般建议使用typename。

举个可以实际运行的例子:

#include <iostream>
#include <string>template<class T>
inline T const& max(T const& a,T const& b){return a>b?a:b;
}int main(){std::cout<< ::max(2,1)<<std::endl;std::cout<< ::max(1.12,4.5)<<std::endl;std::string str1="hello";std::string str2="rollen";std::cout<< ::max(str1,str2)<<std::endl;return 0;
}

  注意上面使用了::max,是为了和std::max进行区分的。

但是如果试图使用某一类型的时候,但是这个类型中并没有定义我们在模板函数中所使用的某一些操作的时候,就会出现错误。

std::complex<float> c1,c2;max(c1,c2);

上面的代码在编译期间就会出现错误。

实际上,我们的template会被编译两次:

第一次:主要是对代码进行语法检查,比如缺少分号,什么的。

第二次: 主要是对template代码中所进行的操作进行检查,就如同上面的那样,是否使用了未定义的操作等等。

其实这样会导致一些问题的,我们在后面的内容中会探讨这个问题。

template<class T>
inline T const& max(T const& a,T const& b){return a>b?a:b;
}std::cout<< ::max(2,1)<<std::endl;   //编译器可以推导出是两个int
std::cout<< ::max(1.12,4.5)<<std::endl;  //编译器可以推到出是两个double
//std::cout<< ::max(1 , 1.2)<<std::endl;   //这条错误

函数模板的参数分为两种:template parameter和call parameter参数两种。比如对于上面的max代码,其中的T是template parameter参数,a,b是call parameter参数。前者的数量可以是任意的,但是你不能在函数模板中为他们设定初始值,这一点和class template是不一样的,后面会提到。

对于上面代码中的那一条错误语句,其实你可以改为下面的语句:

std::cout<< ::max<double>(1 , 1.2)<<std::endl; 

但是如果template parameter和call parameter参数没有明显的联系的时候,并且编译器无法推断出template parameter的时候,你就需要明确的指定template argument,例如你可以在max中引入第三个template argument type 作为返回类型:

template<typename T1,typename T2,typename RT>
inline RT max(T1 const& a, T2 const& b);max<int,double,double>(1,2.3);

但是这样的话,需要在max的尖括号中写3个参数,其实我们至于要改变一些RT的顺序,就可以只需要写一个参数就行了:

template<typename RT,typename T1,typename T2>
inline RT max(T1 const& a, T2 const& b);max<double>(1,2.3);

 在这个例子中,只要我们明确的指出返回类型,然后编译器就可以自动推断出a和b的类型; 

关于模板函数的重载问题:

首先来看看一个小例子:

#include <iostream>
#include <string>
#include <cstring>template<class T>
inline T const& max(T const& a, T const& b){std::cout<<"inline T const& max(T a, T b)"<<std::endl;return a>b ? a :b;
}template<class T>
inline T* const& max(T* a, T* b){std::cout<<"inline T* const& max(T* a, T* b)"<<std::endl;return *a > *b ?a: b;
}inline char const* const& max(char const* const& a, char const* const& b){std::cout<<"inline char const* const& max(char const* const& a, char const* const& b)"<<std::endl;return std::strcmp(a,b)<0?b:a;
}int main(){int a=1,b=2;::max(a,b);std::string str1="hello";std::string str2="rollen";::max(str1,str2);int* pa=&a;int* pb=&b;::max(pa,pb);char const* s1="hello";char const* s2="rollen";::max(s1,s2);return 0;
}

运行结果为:

大家可以注意编译器优先选择那些特化的模板。

另外建议大家在重载函数模板的时候,不同的重载形式之间最好存在绝对必要的差别,并且请把所有形式的重载函数写在他们的被调用点之前。


转载于:https://www.cnblogs.com/rollenholt/archive/2012/03/07/2383475.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260939.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

选择更安全的方式执行你的puppet更新

选择更安全的方式执行你的puppet更新生产环境中&#xff0c;puppet的更新有需要节点自动更新的&#xff0c;有需要通过puppetmaster推送更新的&#xff0c;还有需要节点更新时间离散的。下面讲解三种更新方式2.7 Puppet更新方式2.7.1 节点定时更新[rootagent1 ~]# vim /etc/pup…

c ajax定时获取,ajax的定时调用每5秒调用一次

这篇文章主要介绍了关于ajax的定时调用&#xff0c;本例为每5秒调用一次&#xff0c;大家可以根据自己的需求更改代码如下:function initXMLRequest(){if (window.ActiveXObject) {xmlRequest new ActiveXObject("Microsoft.XMLHTTP");} else {if (window.XMLHttpRe…

[C++]有关深复制与copy constructor的一些问题与实例

纸上得来终觉浅&#xff0c;绝知此事要躬行 --- 今天对此话有了实际的领悟。之前学习C的时候&#xff0c;自以为已经把深复制和复制构造函数等这些知识已经掌握了&#xff0c;但真正写起项目来的时候&#xff0c;还是不能提前考虑这些问题&#xff0c;直到问题出现&#xff0c;…

Xml Tips

Xml Tips//z 2012-3-7 16:43:47 PM IS2120CSDN1. xml 中的注释<!-- 这是注释 -->并非用于 XML 分析器的内容&#xff08;例如与文档结构或编辑有关的说明&#xff09;可以包含在注释中。注释以 <!-- 开头&#xff0c;以 --> 结尾&#xff0c;例如<!--catalog la…

算法复杂度为O(N) 的排序算法

题目&#xff1a;某公司有几万名员工&#xff0c;请完成一个时间复杂度为O(n)的算法对该公司员工的年龄作排序&#xff0c;可使用O(1)的辅助空间。分析&#xff1a;排序是面试时经常被提及的一类题目&#xff0c;我们也熟悉其中很多种算法&#xff0c;诸如插入排序、归并排序、…

OpenJudge计算概论-字符串排序

/* 字符串排序 总时间限制: 1000ms 内存限制: 65536kB 描述 参考整数排序方法&#xff0c;设计一种为字符串排序的算法&#xff0c;将字符串从小到大输出 输入 第一行为测试数据组数t, 后面跟着t组数据。每组数据第一行是n&#xff0c;表示这组数据有n行字符串&#xff0c;接下…

Window7+vs2008+QT环境搭建

记录下自己是如何搭建QT开发环境的&#xff0c;备忘吧。操作系统&#xff1a;win7&#xff0c;其实winXP&#xff0c;win7都没有关系&#xff1b;我使用的机器安装的操作系统是win7&#xff1b;开发环境是VS&#xff0c;使用2005,2008,2010或者即将发布的2011都行&#xff1b;因…

history命令

1. 历史命令不会无休止的保存下去&#xff0c;默认的最大保存量为1000条输入&#xff1a;echo $HISTSIZE1000条从profile文件中定义的&#xff0c;可以在里面修改保存数量。/etc/profile用于整个系统所有用户&#xff0c; ~/.bash_profile, ~/.profile和~/.bashrc 用于各个用户…

Javascript创建对象的几种方式?

javascript 中常见的创建对象的几种方式&#xff1a; 1. 使用Object构造函数创建&#xff1b; 使用Object构造函数来创建一个对象&#xff0c;下面代码创建了一个person对象&#xff0c;并用两种方式打印出了Name的属性值。 var person new Object(); person.name"kevin&…

使用DIV之后 table何去何从

表格并非鸡肋 相反是一道大餐 XHTML标准中的一些元素分为三大类&#xff1a; 辅助布局设计元素&#xff1a;DIV SPAN 这类元素的主要功能是用来布局整个页面的&#xff0c;灵活使用这些元素的各种属性&#xff0c;可以让你的页面表现丰富多彩。结构化元素或信息元素&#xff1…

使用 RMAN 同步数据库

使用 RMAN 同步数据库使用 RMAN 同步数据库一&#xff0e;概述二 操作步骤(一)&#xff0e;把生产库置为归档模式(二).启动rman做数据库0级备份(三)&#xff0e;修改生产库数据库到未归档(四)&#xff0e;拷贝备份集到测试库(五).在测试库上的操作一&#xff0e;概述 因项目组遇…

解决 用户'sa'登录失败。错误:18456 问题

问题描述&#xff1a;用户sa登录失败。错误:18456 产生原因&#xff1a;由于服务器身份验证模式为‘Windows 身份验证模式’&#xff0c;所以导致登录失败 解决方案&#xff1a; 1.使用‘Windows 身份验证模式’登录服务器 2.打开‘对象资源管理器’&#xff0c;右键根节点…

js实现图片上传预览及进度条

js实现图片上传预览及进度条 原文js实现图片上传预览及进度条 最近在做图片上传的时候&#xff0c;由于产品设计的比较fashion&#xff0c;上网找了比较久还没有现成的&#xff0c;因此自己做了一个&#xff0c;实现的功能如下&#xff1a; 1&#xff1a;去除浏览器<input …

webapi文档描述-swagger

最近做的项目使用mvcwebapi&#xff0c;采取前后端分离的方式&#xff0c;后台提供API接口给前端开发人员。这个过程中遇到一个问题后台开发人员怎么提供接口说明文档给前端开发人员,最初打算使用word文档方式进行交流&#xff0c;实际操作中却很少动手去写。为了解决这个问题&…

《推荐系统实践》样章:如何利用用户标签数据

《推荐系统实践》样章&#xff1a;如何利用用户标签数据 推荐系统的目的是联系用户的兴趣和物品&#xff0c;这种联系需要依赖于不同的媒介。GroupLens在文章1中认为目前流行的推荐系统基本上通过三种方式来联系用户兴趣和物品。如图1所示&#xff0c;第一种方式是通过用户喜欢…

应用程序创建自己的奔溃转储(crash dump)文件

1、注册自定义的UnhandledExceptionFilter&#xff0c;C/C Runtime Library下需要注意自定义handler被移除&#xff08;hook kernel32.dll的SetUnhandledExceptionFilter使它返回一个空指针即可&#xff09;。 PTOP_LEVEL_EXCEPTION_FILTER v_prevUnhandledExceptionFilter;…

jqMobi + Android 试手

忙活的一个晚上&#xff0c;搞定了一个界面&#xff0c;主要在滚动条和风格上花了不少时间&#xff0c;jqMobi的文档真的少的可怜&#xff0c;希望文档可以多点&#xff0c;以下是几份参考资料&#xff1a; 最新的Api参考&#xff1a;http://www.shareach.com/jq/一些简单的范例…

STM32 基于正电原子开发板,改换芯片为STM32F103R6,Proteus仿真的一些问题

最近在学STM32&#xff0c;网上收集了一些信息&#xff0c;最后用正点原子的开发板来学习。 MDK的配置请参考原子哥的资料&#xff0c;我主要的学习方法是参考原子哥的开发板与实验案例&#xff0c;改换不一样的芯片&#xff0c;也要做出的一样的效果。但在最基础的入门就遇到…

深入理解闭包系列第二篇——从执行环境角度看闭包

前面的话 本文从执行环境的角度来分析闭包&#xff0c;先用一张图开宗明义&#xff0c;然后根据图示内容对代码进行逐行说明&#xff0c;试图对闭包进行更直观的解释 图示 说明 下面按照代码执行流的顺序对该图示进行详细说明 function foo(){var a 2;function bar(){console.…

没事写着玩 系列之 JQ连连看(很丑陋,很初级)

说明:(图片自备, 名称为 jpg[0,2].jpg class为( one two three)对应 前面的 0,1,2) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://ww…