C++ template 模板详解
模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。使用模板的目的就是能够让程序员编写与类型无关的代码。模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。
模板(Template)指C++程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计。C++ 的标准库提供许多有用的函数大多结合了模板的观念,如STL以及IO Stream。模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。模板是一种对类型进行参数化的工具;通常有两种形式:函数模板和类模板;函数模板 针对仅参数类型不同的函数;类模板 针对仅数据成员和成员函数类型不同的类。
函数模板
模板函数定义的一般形式如下所示:
template <class type> ret-type func-name(parameter list)
{// 函数的主体
}template <class 形参名,class 形参名,......>
返回类型 函数名(参数列表)
{//函数体
}
在这里,type 是函数所使用的数据类型的占位符名称。这个名称可以在函数定义中使用。其中template和class是关键字,class可以用typename 关键字代替,在这里typename 和class没区别,<>括号中的参数叫模板形参,模板形参和函数形参很相像,模板形参不能为空。一但声明了模板函数就可以用模板函数的形参名声明类中的成员变量和成员函数,即可以在该函数中使用内置类型的地方都可以使用模板形参名。模板形参需要调用该模板函数时提供的模板实参来初始化模板形参,一旦编译器确定了实际的模板实参类型就称他实例化了函数模板的一个实例。
下面是函数模板的实例,返回两个数中的最大值:
#include <iostream>
#include <string>using namespace std;template <typename T>
inline T const& Max (T const& a, T const& b)
{ return a < b ? b:a;
}
int main ()
{int i = 39;int j = 20;cout << "Max(i, j): " << Max(i, j) << endl; double f1 = 13.5; double f2 = 20.7; cout << "Max(f1, f2): " << Max(f1, f2) << endl; string s1 = "Hello"; string s2 = "World"; cout << "Max(s1, s2): " << Max(s1, s2) << endl; return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
Max(i, j): 39
Max(f1, f2):
20.7
Max(s1, s2): World
类模板
template<class 形参名,class 形参名,…>
class 类名{ ... };
类模板和函数模板都是以template开始后接模板形参列表组成,模板形参不能为空,一但声明了类模板就可以用类模板的形参名声明类中的成员变量和成员函数,即可以在类中使用内置类型的地方都可以使用模板形参名来声明。比如:在类A中声明了两个类型为T的成员变量a和b,还声明了一个返回类型为T带两个参数类型为T的函数hy。
template<class T> class A{public: T a;T b; T hy(T c, T &d);};
下面的实例定义了类 Stack<>,并实现了泛型方法来对元素进行入栈出栈操作:
#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
#include <stdexcept>using namespace std;template <class T>
class Stack { private: vector<T> elems; // 元素 public: void push(T const&); // 入栈void pop(); // 出栈T top() const; // 返回栈顶元素bool empty() const{ // 如果为空则返回真。return elems.empty(); }
}; template <class T>
void Stack<T>::push (T const& elem)
{ // 追加传入元素的副本elems.push_back(elem);
} template <class T>
void Stack<T>::pop ()
{ if (elems.empty()) { throw out_of_range("Stack<>::pop(): empty stack"); }// 删除最后一个元素elems.pop_back();
} template <class T>
T Stack<T>::top () const
{ if (elems.empty()) { throw out_of_range("Stack<>::top(): empty stack"); }// 返回最后一个元素的副本 return elems.back();
} int main()
{ try { Stack<int> intStack; // int 类型的栈 Stack<string> stringStack; // string 类型的栈 // 操作 int 类型的栈 intStack.push(7); cout << intStack.top() <<endl; // 操作 string 类型的栈 stringStack.push("hello"); cout << stringStack.top() << std::endl; stringStack.pop(); stringStack.pop(); } catch (exception const& ex) { cerr << "Exception: " << ex.what() <<endl; return -1;}
}
当上面的代码被编译和执行时,它会产生下列结果:
1
2
3
7
hello
Exception: Stack<>::pop(): empty stack
C++ template 模板详解相关推荐
- Ansible PLaybook template 模板详解
template 模板 模板是一个文本文件,可以做为生成文件的模版,并且模板文件中还可嵌套jinja语法 jinja2语言 网站:https://jinja.palletsprojects.com/e ...
- 26.C++- 泛型编程之类模板(详解)
在上章25.C++- 泛型编程之函数模板(详解) 学习了后,本章继续来学习类模板 类模板介绍 和函数模板一样,将泛型思想应用于类. 编译器对类模板处理方式和函数模板相同,都是进行2次编译 类模板通 ...
- 25.C++- 泛型编程之函数模板(详解)
本章学习: 1)初探函数模板 2)深入理解函数模板 3)多参函数模板 4)重载函数模板 当我们想写个Swap()交换函数时,通常这样写: void Swap(int& a, int& ...
- android组件模板,提高效率必备神器 ---- Android Studio模板详解
原标题:提高效率必备神器 ---- Android Studio模板详解 Android Studio模板大家应该很熟悉,你新建一个project或者module的时候,AS会帮你提供几个选项供你选择 ...
- 【无标题】类模板详解\n类模板的定义及实例化\ntemplate\u003Cclass 模板参数>\nclass 类名 {\n // 类定义\n};\n\ntemplate\u003Ctypen
类模板详解\n类模板的定义及实例化\ntemplate\u003Cclass 模板参数>\nclass 类名 {\n // 类定义\n};\n\ntemplate\u003Ctypenam ...
- 类模板详解\n类模板的定义及实例化 模板参数
类模板详解\n类模板的定义及实例化\ntemplate\u003Cclass 模板参数>\nclass 类名 {\n // 类定义\n};\n\ntemplate\u003Ctypenam ...
- html 自定义打印模板,HTML+CSS入门 自定义模板详解
本篇教程介绍了HTML+CSS入门 自定义模板详解,希望阅读本篇文章以后大家有所收获,帮助大家HTML+CSS入门.< 首先总的stylecss和大模板都是当初angel_Kitty学姐的,嗯, ...
- 新闻类APP模板详解(android版)
1.概述 本文将介绍一个android版新闻类app模板,是本人整合了网上各类资源后整理出来的,希望对大家有所帮助! iOS版新闻类app模板详见: 新闻类APP模板详解(iOS版) 本模板app截图 ...
- 【带你吃透C++】模板详解
本文收录于专栏:C++ 关注作者,持续阅读作者的文章,学习更多知识! https://blog.csdn.net/weixin_53306029?spm=1001.2014.3001.5343 模板详 ...
最新文章
- 十年沉淀,阿里云发布全球领先的对象存储OSS可用性SLA
- java app退出登录_java – 通过从一个Activity调用一个函数,将退出按钮添加到Android App...
- HTML仿网易云音乐首页静态,用 Vue.js 模仿一个简单的网易云音乐
- 信息安全管理体系ISO27001
- node mysql菜鸟教程_Node.js Web 模块
- usb计算机连接 不再弹出,电脑usb无法安全弹出问题解决办法
- 天空之城用计算机弹歌,原神琴谱天空之城怎么弹?天空之城琴谱一览
- 计算非等间隔离散曲线的曲率
- 计算机桌面的内存设置方法,计算机内存不足【处理方法】
- 抖音直播带货怎么开通?最新政策及直播带货话术技巧!
- 利用数据库对四大名著人物信息进行存储
- 如何解决Win10删除文件慢的办法
- 20个经典的Java应用
- 数组练习题-java
- abaqus python_ABAQUS-Python 批处理
- UE4 如何将材质Material保存为本地图片Png
- CPU使用率过高咋办?看这里
- 如何判断用户是用Modem还是经过路由器上网呢
- 初学电力系统中正序、负序、零序及对称分量法的推导
- 人脸表情识别 微信小程序 百度智能云人脸识别API(含完整项目文件)