C++模板简介
来源:互联网 发布:设计画册的软件 编辑:程序博客网 时间:2024/05/16 15:26
C++模板概观(Overview)
C++模板简介(1)
1.模板(Templates)是C++的一种特性,允许函数或类通过泛型(generic types)的形式表现或运行
2.模板可以使得函数或类在对应不同的型别(types)的时候正常工作,而无需为每一个型别都写一份代码
3.一个简单的例子:
如果要写一个取得两个数中较大值的函数Max,在不使用模板的情况下,我们不得不针对不同的型别(比如int ,long,char)提供每一种型别的重载:
int Max(int a,int b){ return (a>b)?a:b;}long Max(long a,long b){ return (a>b)?a:b;}char Max(char a,char b){ return (a>b)?a:b;}
C++模板简介(2)
1.一个简单的例子(续)
如果使用模板,则可以省去一堆冗余代码,从而将函数原型缩减到非常简洁的表达:
template <typename T> T Max(T a,T b){ return (a>b)?a:b;}
2.C++主要有两种类型的模板
类模板(Class template):使用泛型参数的类(classes with generic parameters)
函数模板(Function template):使用泛型参数的函数(functions with generic parameters)
C++模板简介(3)
1.模板实例化
- 模板的声明(declaration)其实并未给出一个函数或类的完全定义(definition),只是提供了一个函数或类的语法框架(syntactic skeleton)
- 实例化是指从模板构建出一个真正的函数或类的过程,比如
template <typename T> struct Object{...};
可以用来构建诸如Object<int>,Object<char>,Object<int*>,Object<MyClass*>
等等不同型别的具体实例 - 实例化有两种类型
显式实例化–在代码中明确指定要针对那种型别进行实例化
隐式实例化–在首次使用时根据具体情况使用一种合适的型别进行实例化
C++函数模板(Function Template)
C++函数模板(1)
1.什么是函数模板?
- 函数模板是参数化的一族函数(a family of functions)
- 通过函数模板,可以定义一系列函数,这些函数都基于同一套代码,但是可以作用在不同型别的参数上
template <typename t>inline T Max(const T& a,const T& b){ return (a>b)?a:b;}
2.定义函数模板
- 定义一个函数模板,返回两数中较大的那个,该函数有两个参数:(a,b)
- 参数型别未定,以模板参数T表示
- 模板参数由关键字typename引入
C++函数模板(2)
1.定义函数模板(续)
- 也可以使用class替代typename来定义型别参数
template <class T> inline T Max(const T& a,const T& b) { ... }
- 从语法上讲使用class和使用typename没有区别
- 但从语义上,class可能会导致误区,即只有类才能作为型别参数;而事实所表达的意思不仅仅只针对类,任何型别都可以
- 请尽量使用typename!
- class可以取代typename,但struct却不可以,以下写法语法上是错误的:
//this is wrong!!!template <struct T> inline T Max(const T& a,const T& b){...}
C++函数模板(3)
1.模板函数的使用
- 调用Max,用int,float,以及std::wstring作为模板参数替换T
- 对于不同的型别,都从模板实例化出不同的函数实体
- 但是不可以使用不同型别的参数来调用Max,因为编译器在编译时已经知道Max函数需要传递的型别
C++函数模板(4)
1.模板实例化
- 用具体型别替代模板参数T的过程叫做实例化(instantiation);从而产生了一个模板实例
- 一旦使用函数模板,这种实例化过程便由编译器自动触发的,不需要额外去请求模板实例化
- 如果实例化一种型别,而该型别内部并不支持函数所使用的操作,那么就会导致一个编译错误,如下所示:
std::complex并没有重载">"
,也就是说该型别并不支持使用">"
比较大小,而Max函数使用">"
来判断c1,c2的大小,所无法通过Max(c1,c2)得到预期的结果.std::complex<int> c1(1,2),c2(15,16);//编译错误
C++函数模板(5)
C++函数模板(6)
C++函数模板(7)
C++函数模板(8)
C++函数模板(9)
C++类模板(Class Template)
C++类模板(1)
C++类模板(2)
C++类模板(3)
C++类模板(4)
C++类模板(5)
C++类模板(6)
C++类模板(8)
C++类模板(9)
C++类模板(10)
C++类模板(11)
C++类模板(12)
C++类模板(13)
C++类模板(14)
C++操作符重载(Operator Overload)
C++操作符重载(1)
C++操作符重载(2)
C++操作符重载(3)
阅读全文
0 0
- 【C/C++】C++模板元编程 入门简介
- C++-模板
- C++-模板
- C++:模板
- C++:模板
- C++:模板
- 模板 (C++)
- C ++ 模板
- C ++ 模板
- 【C++】模板
- c++----------模板
- C++--------------------------------------------模板
- c++--模板
- C++:模板
- velocity模板引擎简介
- IE打印模板简介
- IE打印模板简介
- IE打印模板简介
- 11.5_周总结
- Spring登录页面(用配置+注解方式)
- elasticSearch空间坐标的设置和查询
- 后缀表达式
- 5.1、数组与排序
- C++模板简介
- Python得关键术语
- 文件IO---标准输入、标准输出和标准错误
- 【设计模式】--SINGLETON模式
- 按照与输入顺序相反的顺序建立单链表
- Mysql性能调优
- 团队天梯赛L1-001.Hello World!
- 17.11.04日报
- 一个简单的java程序的构成