C++学习笔记--类模板
来源:互联网 发布:绝食瘦下来知乎 编辑:程序博客网 时间:2024/06/08 17:27
C++中将泛型思想引入到了类,实现了类模板,使得类的实现不再关注数据元素的具体类型,而只关注类所需实现的功能,适用于编写数据结构相关代码。
C++中的类模板以相同的方式处理不同的类型,在类的声明前使用template关键字标识将要泛型编程,<typename T>用于说明类中使用的T是泛指类型,类模板只能显式指定具体类型,无法像函数模板那样能够自动推导,下面给出定义过程和使用方法:
template < typename T >class Operator{public: T add(T a, T b) { return a + b; }};使用:
Operator<int> op1;//使用具体类型<type>定义对象 cout << op1.add(1, 2) << endl;注意:
类模板声明的泛指类型T可以出现在类模板的任意地方。
编译器对类模板的处理方式和函数模板相同,通过具体类型从类模板产生不同的类,在声明的地方对类模板代码本身进行编译,在使用的地方对参数替换后的代码进行编译。
类模板的工程应用:
类模板必须在头文件中定义。
类模板不能分开实现在不同的文件中。
类模板外部定义的成员函数需要加上模板< >声明。
以上并非硬性规定,只是工程中使用起来阅读性更强。
#ifndef _OPERATOR_H_#define _OPERATOR_H_template < typename T >class Operator{public: T add(T a, T b); T multiply(T a, T b);};template < typename T >T Operator<T>::add(T a, T b){ return a + b;}template < typename T >T Operator<T>::multiply(T a, T b){ return a * b;}#endif这就完全符合工程应用中的规定。实现是在头文件中,但是使用依旧和普通类成员函数一样,在源文件中使用。
多参数类模板
类模板可以定义任意多个不同的类型参数。
template< typename T1, typename T2 >class Test{public: void add(T1 a, T2 b);};在使用的时候需要将参数类型显式指定出来,例如:
Test<int, float> t1;类模板可以被特化,就是指定类型参数的类模板的特定实现,和前面一样,部分类型参数必须显式指定,特化模型有两种,部分特化和完全特化,部分特化就是多个参数都一样,但是并未指定出具体类型,完全特化就是多个参数显式指定出具体类型,用前面的类模板做例子实现部分特化和完全特化:
部分特化:
template< typename T >class Test < T, T > // 当 Test 类模板的两个类型参数完全相同时,使用这个实现{public: void add(T a, T b);};完全特化;
template< >class Test < int, int > // 当 Test 类模板的两个类型参数显式指定,使用这个实现{public: void add(int a, int b);};指针相关的特化实现;
template< typename T1, typename T2 >class Test < T1*, T2* > // 指针的特化实现{public: void add(T1* a, T2* b);};这些特化只是模板的分开实现,本质上还是同一个模板,并且所有特化模板的使用方式都是统一的,必须显式指定每一个类型参数,当你使用了不同组合的参数类型,是编译器自动选择调用哪一个特化实现的。
类模板特化与重定义的区别:
重定义:一个类模板和一个新类(或者两个类模板),使用的时候需要考虑如何选择的问题。
特化:以统一的方式使用类模板和特化类,编译器自动优先选择特化类。
函数模板也支持特化,但是只支持参数类型完全特化。
函数模板和完全特化的函数模板:
template< typename T >//函数模板bool Equal(T a, T b){ //... //...}template< >//完全特化bool Equal<double>(double a, double b){ //... //...}
工程中建议当需要重载函数模板时优先考虑使用模板特化,当模板特化无法满足要求再使用函数重载。
阅读全文
0 0
- C++Template学习笔记之函数模板
- (C/C++学习笔记)函数模板加强
- C/C++学习笔记(2)--函数模板template<typename T>,类模板详解(1)
- C++模板类学习笔记
- cplusplus 模板类学习笔记
- C++学习笔记--类模板
- C/C++_log2000_函数模板与类模板笔记1
- C/C++_log2000_函数模板与类模板笔记2
- (C/C++学习笔记)函数模板遇上函数重载
- (C/C++学习笔记)函数模板的深入理解
- 【C++】学习笔记四十三——函数模板
- 学习C++模板---模板类作为基类
- 学习C++模板---模板类带简单参数
- C++primer学习:模板编程(2):类模板的定义
- C++primer学习:类模板(2)类模板:模板参数,成员模板和控制实例化
- C++学习笔记(一)函数模板与类模板
- C++template ;模板学习
- C++学习笔记_9:类模板
- SSL_2278 Oliver的救援
- Linux 升级 Python 至 3.x
- opencv: cv2.rectangle 通过确定对角线 画矩形
- PowerDesigner提示This data item is already used in a primary identifier.的处理
- 关于SEO关键词密度的误区(SEO优化核心盘点补充)
- C++学习笔记--类模板
- 集合相关
- [机器学习:李宏毅]6、Backpropagation
- Android屏幕适配--六大适配方法
- 线程及线程安全解决方法
- Mysql
- webrtc中的网络反馈与控制
- POJ1426-Find The Multiple
- 家族 SSL_1896 (并查集)