模板观念与函数模板
简单了解模板观念
C++模板简介
- 模板(Templates)是C++的一种特性,允许函数或类通过泛型(generic types)的形式表现或运行
- 模板可以使得函数或类在因对不同类别(types)的时候可以正常工作,而无需为每个类型都写一份代码
- 一个简单的例子:
- 如果要写一个取两个数中较大的函数Max,在不适用模板的情况下,我们不得不针对不同的类别(eg: int long char…)提供一种类别的重载
int 型
int Max(int a, int b) {
return (a > b) ? a : b;
}
long型
long Max(long a, long b) {
return (a > b) ? a : b;
}
char型
char Max(char a, char b) {
return (a > b) ? a : b;
}
一个简单的例子
如果使用模板,则可以省去一堆代码,从而将代码原型缩减到非常简介的表达:
template <typename T> T Max(T a, T b) { return (a > b) ? a : b; }
C++ 主要有两种类型的模板:
- 类模板(Class template):使用泛型参数的类(classes with generic parameters)
- 函数模板(Function template):使用泛型参数的函数(Functions with generic parameters)
模板实例化
- 模板的声明(declaration)其实并未给出一个函数或类的完全定义(definition),只是提供了一个函数或类的语法框架(syntactical skeleton)
实例化时指从模板够检出一个真正的函数或类的过程,比如:
template <typename T> struct Object{....} ``` - 可以用来构建诸如Object<int>, Object<char>, Object<int*>, Object<MyClass*>等等不同类别的具体实例 - 实例化有两种类型: - **显式**实例化-在代码中明确指定要正对哪位类别进行实例化 - **隐式**实例化-在首次使用时根据具体情况一种合适的型别惊醒实例化 ## C++函数模板 - 什么时函数模板? - **函数模板**是参数化的一族函数(a family of functions) - 通过函数模板,可以定义一系列函数,这些函数都是基于同一代码,但是可以用作在不同类别的参数上
template
inline T Max(const T& a, const T& b) {
return (a > b) ? a : b;
}- 定义函数模板 - 定义一个函数模板,反水数中较大一个,该函数有两个参数:(a,b) - 参数类别未定,以模板参数T表示 - 模板参数由关键字typename引入 - 也可以使用class代替typename来定义类型参数 - 从语法上讲使用class和使用typename没有区别 - 单从语义上,class可能会导致误区,即只有类才能作为类别参数;而事实上T所以表达的意思不仅仅只针对类,任何类别都可以 - 参数推导 - 模板参数是有传递给模板函数的实参所决定的 - 不允许自动类型转换:每个T必须严格匹配
Max(1, 2) //两次实参的类型都是int
Max(1, 2.0) //ERROR:第一参数的类别是int第二参数类别是double- 一般有两种处理这种错误的方法: 1. 用static_cast<double>或者强制转换参数类型以使两者匹配
Max(static_cast
(1),2.0) 1. 显示指定T的类别
Max
(1, 2.0) - 函数模板重载 - 函数模板也可以像普通函数一样被重载 - 非模板函数可以和**同名**的模板函数共存 - 编译器同通过函数模板参数推导来决定使用调用哪个函数
inline int const& Max(const int const& a, const int const& b)
template
inline T const& Max(const T const& a, T const& b)template
inline T const& Max(const T const& a, T const& b, const T const& c)
```
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!