模板(template)是泛型编程的基础,"泛型"的含义就是没有不依赖具体的数据类型.模板的引入是为了创建一般性的类(模板类)或者函数(模板函数).典型的容器比如迭代器/算法等是泛型编程的典型案例.例如,定义了一个vector,可以使用vector<int>, vector<string>, vector<vector>等等.

函数模板

模板函数的一般定义方式为: 这里的type可以看做是代表了一种数据类型的占位符名称, 在函数内部的定义中可以使用它.

template <class type> 
ret-type func-name(parameter list){
// body of function
}

举例分析如下. 注意, typename关键词和class关键词的作用是相同的,class关键词会让你产生是否定义的type只能是类,而不能是其他的数据类型? 为了避免这个歧义,这里引入了typename!!!

 #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 = ;
int j = ;
cout << "Max(i, j)" << Max(i, j) << endl; # Max(i,j): 39 double f1 = 13.5;
double f2 = 20.7;
cout << "Max(f1, f2)" << Max(f1, f2) << endl; # Max(f1, f2): 20.7 string s1 = "Hello";
string s2 = "World";
cout << "Max(s1, s2)" << Max(s1, s2) << endl; # Max(s1, s2): World return ; }

类模板

就像我们定义函数模板一样, 这里也可以定义类模板. 声明类模板的一般形式为:

template <class type>
class class-name{ }

举例:

#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
#include <stdexcept> using namespace std; template <class T>
class Stack {
private:
vector<T> elems; // elements public:
void push(T const&); // push element
void pop(); // pop element
T top() const; // return top element
bool empty() const{ // return true if empty.
return elems.empty();
}
}; template <class T>
void Stack<T>::push (T const& elem) {
// append copy of passed element
elems.push_back(elem);
} template <class T>
void Stack<T>::pop () {
if (elems.empty()) {
throw out_of_range("Stack<>::pop(): empty stack");
} // remove last element
elems.pop_back();
} template <class T>
T Stack<T>::top () const {
if (elems.empty()) {
throw out_of_range("Stack<>::top(): empty stack");
} // return copy of last element
return elems.back();
} int main() {
try {
Stack<int> intStack; // stack of ints
Stack<string> stringStack; // stack of strings // manipulate int stack
intStack.push();
cout << intStack.top() <<endl; // 7 // manipulate string stack
stringStack.push("hello");
cout << stringStack.top() << std::endl; // hello
stringStack.pop();
stringStack.pop();
}catch (exception const& ex) {
cerr << "Exception: " << ex.what() <<endl; // Exception: Stack<>::pop(): empty stack
return -;
}
}

参考:

[1] C++ Templates: https://www.tutorialspoint.com/cplusplus/cpp_templates.htm

C++模板(Templates)的更多相关文章

  1. Django学习总结之模板templates

    - django模板: templates - 模板分为两个过程: 1, 加载 : loader.get_template('xxx.html') 返回值是一个template对象 2, 渲染 : t ...

  2. 【Django笔记1】-视图(views)与模板(templates)

    视图(views)与模板(templates) 1,视图(views) ​ 将接收到的数据赋值给模板(渲染),再传递给浏览器.HTML代码可以直接放在views.py(文件名可任意更换),也可以放在t ...

  3. juqery模板 Templates

    现在已经有了许多JavaScript的解决方案模板,从这方面说,标准化的模板解决方案必然是大势所趋.在本节中,我们向你简要描述四个最流行最有趣的模板.现有的模板解决方案能解决什么?那些特色在jQuer ...

  4. Django学习(二)---使用模板Templates

    学会使用渲染模板的方法来显示html内容. 一.Templates是什么: HTML文件 使用了Django模板语言(Django Tamplate Language DTL) 可以使用第三方模板 二 ...

  5. python测试开发django-5.模板templates

    前言 html是一个静态的语言,里面没法传一些动态参数,也就是一个写死的html页面.如果想实现在一个固定的html样式,传入不同的参数,这就可以用django的模板传参来解决. 模板参数 先在hel ...

  6. AS 代码模板 文件模板 Templates MD

    修改 File and Code Templates Settings –> Editor –>[File and Code Templates] 或者在右键new时选择子菜单[Edite ...

  7. 1.2模板templates

    一.模板使用 1. 配置模板目录 如果命令行创建的项目,需要手动配置模板文件目录,如果是Pycharm创建的项目,则无需配置 在项目根目录下创建模板目录,比如叫 templates,后续开发模板文件会 ...

  8. django学习-6.模板templates

    1.前言 首先,我们要知道html是一门静态语言,里面没法传一些动态参数,也就是一个写死的html页面. 那么,如果我们想实现在一个html页面里传入不同的参数对应的参数值,这就可以用django框架 ...

  9. 模板templates的使用

    目录 模板及其渲染 模板查找路径 DTL模板语法 常用的模板标签 DTL常用过滤器 模块结构优化 加载静态文件 模板及其渲染 视图函数只是直接返回文本,而在实际生产环境中其实很少这样用,因为实际的页面 ...

随机推荐

  1. 单点登录(六)-----遇到问题-----cas server 源码部署导入gradle后有感叹号---错误信息A cycle was detected in the build path of pr

    cas server 源码部署导入gradle后有感叹号---错误信息A cycle was detected in the build path of project 'cas-server-cor ...

  2. Android Studio导入ApiDemos

    安卓开发入门篇(一):Android Studio导入ApiDemoshttp://blog.csdn.net/dreamer2020/article/details/52316895 https:/ ...

  3. codeforces contest 1111

    A. Superhero Transformation 题意: 元音和元音,辅音和辅音字母之间可以互相转换,问两个字符串是否想同: 题解:直接判断即可: #include<bits/stdc++ ...

  4. HDU--4764

    题目: Stone 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4764 #include<iostream> #include<c ...

  5. laravel mapSpread 例子

    $collection = collect(range(1, 9)); $chunks = $collection->chunk(2); $labeld = $chunks->mapSpr ...

  6. ppp协议介绍(转)

    原文:https://www.cnblogs.com/gtarcoder/p/6259105.html PPP协议PPP协议是二层(数据链路层)协议,常用于拨号上网时客户端向服务器获取IP地址.PPP ...

  7. Java入门:基础算法之计算三角形面积

    本部分介绍如何计算三角形面积. /** * @author: 理工云课堂 * @description: 程序计算三角形的面积.三角形的底和高由用户输入 */ import java.util.Sca ...

  8. Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader)

    Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字符缓冲流 字符缓冲流根据流的 ...

  9. Seven Techniques for Data Dimensionality Reduction

    Seven Techniques for Data Dimensionality Reduction Seven Techniques for Data Dimensionality Reductio ...

  10. 鸟哥的书——ubuntu命令

    纯粹按着鸟哥的书上的基本命令打一遍,不喜勿喷! Chapter5.首次登录 一.基础命令: 1.显示时间和日期的命令:date dzhwen@deng:~$ date 2014年 02月 23日 星期 ...