参考:

C++ 中模板使用详解

C++模板详解

概念

为了避免因重载函数定义不全面而带来的调用错误,引入了模板机制

定义

 模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。

  • 模板是一种对类型进行参数化的工具
  • 使用模板的目的是为了编写出与类型无关的代码
  • 注意:模板的声明或定义智能在全局、命名空间或类范围内进行。不能在局部范围,函数内部进行。

分类:

  • 函数模板

    • 针对类型不同的参数
  • 类模板
    • 针对数据成员和成员函数类型不同的类

函数模板

template <class 形参名,class 形参名,......> 返回类型 函数名(参数列表)
{
函数体
}

说明: template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,可以用typename 代替。<>括号中的参数叫模板形参

一但声明了模板函数就可以用模板函数的形参名声明类中的成员变量和成员函数,即可以在该函数中使用内置类型的地方都可以使用模板形参名

模板形参需要调用该模板函数时提供的模板实参来初始化模板形参,一旦编译器确定了实际的模板实参类型就称他实例化了函数模板的一个实例。比如swap的模板函数形式为

template <class T> void swap(T &a,T &b){}

注意:不能在函数调用的参数中指定模板形参的类型,对函数模板的调用应使用实参推演来进行。

类模板

template< class 形参名, class 形参名,...> class 类名
{...};

类模板和函数模板都是以template开始后接模板形参列表组成,模板形参不能为空,一但声明了类模板就可以用类模板的形参名声明类中的成员变量和成员函数,即可以在类中使用内置类型的地方都可以使用模板形参名来声明。

    template<class T> class A{public: T a; T b; T hy(T c, T &d);};

在类A中声明了两个类型为T的成员变量a和b,还声明了一个返回类型为T带两个参数类型为T的函数hy。

类模板的创建

比如一个模板类A,则使用类模板创建对象的方法为A m;在类A后面跟上一个<>尖括号并在里面填上相应的类型,这样的话类A中凡是用到模板形参的地方都会被int 所代替。当类模板有两个模板形参时创建对象的方法为A<int, double> m;类型之间用逗号隔开。

注意:对于类模板,模型的形参的类型必须在形参列表中指定,类模板形参不存在实参推演的问题

类模板外部定义成员函数的方法

template<模板形参列表> 函数返回类型 类名<模板形参名>::函数名(参数列表){函数体}

最新文章

  1. 精通css 高级web标准解决方案——可视化格式模型-定位模型
  2. vs2015安装体验
  3. char、varchar、nchar、nvarchar的区别
  4. c中的指针
  5. iOS8 针对开发者所拥有的新特性汇总如下
  6. 恢复Ext3下被删除的文件(转)
  7. 解决VS2008 开发Windows Mobile 项目生成速度慢的问题
  8. 利用Java自带的MD5加密java.security.MessageDigest;
  9. sql server删除数据后空间无变化处理方法
  10. node.js 安装
  11. Java IO :文件
  12. IOS、java支持DES加密
  13. 用label实现自适应宽度的方法
  14. Spring+SpringMVC+MyBatis+easyUI整合优化篇(八)代码优化整理小记及个人吐槽
  15. shell第二篇
  16. WebLogic11g-负载分发
  17. 关于JavaScript(脚本语言)
  18. Neutron中插件与代理的总结
  19. Character流与Byte流的区别(转)
  20. js中提示框闪退问题

热门文章

  1. JVM 调优参数详解
  2. 记一次webservice的超时时间设置
  3. 集合之Stack
  4. Caused by: org.apache.velocity.exception.MethodInvocationException: Invocation of method &#39;getUser&#39; in class org.uncommons.reportng.ReportMetadata threw exception class java.net.UnknownHostException :
  5. JIRA使用方法,简易图解
  6. HDU 1316 (斐波那契数列,大数相加,大数比较大小)
  7. .Net实现表达式计算(公式) 表达式字符串
  8. socket编程小问题:地址已经被使用——Address already in use
  9. TarsGo新版本发布,支持protobuf,zipkin和自定义插件
  10. Vue.js下载方式及基本概念