模板详解(template)

模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。
模板是一种对类型进行参数化的工具;
通常有两种形式:函数模板和类模板;
函数模板针对仅参数类型不同的函数;
类模板针对仅数据成员和成员函数类型不同的类。
使用模板的目的就是能够让程序员编写与类型无关的代码。比如编写了一个交换两个整型int 类型的swap函数,这个函数就只能实现int 型,对double,字符这些类型无法实现,要实现这些类型的交换就要重新编写另一个swap函数。使用模板的目的就是要让这程序的实现与类型无关,比如一个swap模板函数,即可以实现int 型,又可以实现double型的交换。模板可以应用于函数和类。下面分别介绍。
注意: 模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板。

函数模板通式

函数模板格式:

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

其中 template 和 class 是关键字,class 可以用 typename 关键字代替,在这里 typename 和 class 没区别,<>括号中的参数叫模板形参,模板形参和函数形参很相像,模板形参不能为空。一但声明了模板函数就可以用模板函数的形参名声明类中的成员变量和成员函数,即可以在该函数中使用内置类型的地方都可以使用模板形参名。模板形参需要调用该模板函数时提供的模板实参来初始化模板形参,一旦编译器确定了实际的模板实参类型就称他实例化了函数模板的一个实例。比如 swap 的模板函数形式为:

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

当调用这样的模板函数时类型 T 就会被被调用时的类型所代替,比如 swap(a, b) 其中 a 和 b 是 int 型,这时模板函数 swap 中的形参 T 就会被 int 所代替,模板函数就变为 swap(int &a, int &b) 。而当 swap(c, d) 其中 c 和 d 是 double 类型时,模板函数会被替换为 swap(double &a, double &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; 类型之间用逗号隔开。

对于类模板,模板形参的类型必须在类名后的尖括号中明确指定。比如 A< 2> m; 用这种方法把模板形参设置为 int 是错误的(编译错误:error C2079: ‘a’ uses undefined class ‘A< int>’),类模板形参不存在实参推演的问题。也就是说不能把整型值 2 推演为 int 型传递给模板形参。要把类模板形参调置为 int 型必须这样指定 A< int> m。

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

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

比如有两个模板形参T1,T2的类A中含有一个void h()函数,则定义该函数的语法为:

template<class T1,class T2> void A<T1, T2> :: h(){}

注意: 当在类外面定义类的成员时 template 后面的模板形参应与要定义的类的模板形参一致。

再次提醒注意:模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值