C++进阶1模板的使用
C++进阶1模板的使用 20131010
C++中,我们自己编程虽然不会怎么使用模板,包括函数模板和类模板,但是在大型的项目开发中函数模板和类模板是非常重要的。笔者在**面试的时候忙问道过这个问题,迷迷糊糊的过了,但自己知道不是很清楚,所以整理一下。
1.函数模板的声明
函数模板可以用于创建一个通用的函数,用于支持不同类型的参数,避免因为函数的重载重复设计,他最大的特点是把函数使用的数据类型作为参数。
函数模板的声明形式:
template <typename T>
<ReturnType> <functionName> (Arguments){}
其中template是定义函数模板的关键字,template之后的<>不可以省略,而且内部的typename也是关键字可以使用class,用以说明他后面的标识符是数据类型标识符。这样在以后的这个函数中,凡是希望根据实参数据类型确定数据类型的变量都可以使用数据类型参数标识符来表述。
如何使用?直接向普通的函数那样直接调用。编译器就会生成对应的函数。也就是模板函数。
2.模板函数的生成
模板函数的数据类型参数标识符实际上是一个类型参数,使用函数模板的时候,要将这个形参实例化为确定的数据类型。将行使参数实例化的参数称之为模板函数。
同时可以声明多个参数类型,在一个函数中可以同时使用它们。
在函数模板中,可能会因为数据类型的转换而产生异常。但是函数的重载是支持参数的隐式类型转换,所以如果在定义了函数模板之后,在重载一个函数,他有着明确的参数类型,就不会出现异常了。
3.类模板
声明的格式:
template <class T>
class A{};
这样在类定义体外定义的成员函数,需要使用函数模板。
#include <iostream>
#include <string>
using namespace std;
template <typename T>
class Base{
private:
T value;
public:
Base(){
cout << "Base::constructor" << endl;
}
Base(T v){
this->value = v;
}
T getValue(){
return this->value;
}
virtual ~Base(){
cout << "Base::~Base()" << endl;
}
};
int main()
{
Base<string> b("yangtengfei");
cout << b.getValue() << endl;
Base<int> b1 (3);
cout << b1.getValue ()<< endl;
return 0;
}
追梦的飞飞
于广州中山大学20131010
HomePage: http://yangtengfei.duapp.com
C++进阶1模板的使用的更多相关文章
- C++ 进阶学习 ——模板
模板和重载类似,比重载更省事 通常有两种形式:函数模板和类模板: 函数模板针对仅参数类型不同的函数: 类模板针对仅数据成员和成员函数类型不同的类. 一个简单的函数模板 template <cla ...
- bsgs+求数列通项——bzoj3122(进阶指南模板该进)
/* 已知递推数列 F[i]=a*F[i-1]+b (%c) 解方程F[x]=t an+1 = b*an + c an+1 + c/(b-1) = b(an + c/(b-1)) an+1 + c/( ...
- 17-1 djanjo进阶-路由,视图,模板
一 路由系统进阶(urls.py) 动态路由 urls.py中通过正则表达式的分组匹配,捕获用户访问的url中的值,传递给视图函数1 分组匹配(通过圆括号): 相当于给视图函数传递 位置参数 例子: ...
- java-Freemarker-模板引擎学习
博客:Java模板引擎性能对比 Thymeleaf性能偏低. 博客:Java模板引擎 FreeMarker 综合性的介绍,内容有点粗糙. 博客:JavaEE进阶——FreeMarker模板引擎 ...
- Jenkins进阶之自动发送邮件的Default Content设置模板
分享一个简洁实用的Jenkins项目邮件管理系统的"Default Content"设置模板 配置如下: <h1><center><font colo ...
- C++_进阶之函数模板_类模板
C++_进阶之函数模板_类模板 第一部分 前言 c++提供了函数模板(function template.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来 ...
- webpack4打包nodejs项目进阶版——多页应用模板
前段时间我写了个打包nodejs项目的文章,点击前往 但是,问题很多.因为之前的项目是个历史遗留项目,重构起来可能会爆炸,当时又比较急所以就写个的适用范围很小的webpack的打包方法. 最近稍微得空 ...
- flask 电子邮件进阶实践-用模板发送163邮件
电子邮件进阶实践 下面来学习构建邮件的HTML正文,并使用模板组织内容. 一封电子邮件的正文可以是纯文本(text/plain),也可以是HTML格式的文本(text/html).处于全面的考虑,一封 ...
- day 48 ORM 进阶 多表连接 创建 以及 html模板继承
多表的一对多创建 多表的多对多创建 多表的一对多修改 多表的多对多修改 前情提要: 最近认识了不少大佬,大佬开着保时捷. .一顿狂奔..我连车尾灯都看不到.. 本次内容 ORM 的多表链接 查 ...
随机推荐
- 学会JS的this这一篇就够了
转自:http://www.imooc.com/article/1758 以前看某本书上讲: 掌握了JS中this的用法才算真正的跨过了JS的门槛 我深以为是!但是JS的this却并不是那么简单的内容 ...
- 使用 vim + ctags + cscope + taglist 阅读源码
转自:http://my.oschina.net/u/554995/blog/59927 最近,准备跟学长一起往 linux kernel 的门里瞧瞧里面的世界,虽然我们知道门就在那,但我们还得找到合 ...
- Apple 的命令行交付工具“Transporter”
Apple 的命令行交付工具“Transporter” 占坑... https://help.apple.com/itc/transporteruserguide/#/apdATD1E1026-D1E ...
- 让div水平垂直居中的几种方法
最近,公司招了一批新人,吃饭的时候恰好碰到一个新同事,就跟他聊了起来.听他说了主管面试的时候出的一些问题,其中一个问题我印象特别深刻,因为,我当年进来的时候,也被问到这个问题.虽然这个问题已经问烂了, ...
- 为什么gitHub提交记录显示作者名称是unknow?
unknow,为什么? gitHub上提交记录显示作者名称是unknow,刚开始没怎么管,后面遇到问题看提交记录时发现有两个unknow(一定有一个人遇到和我一样的问题了,哈哈..),于是解决一下吧. ...
- Python3.x:selenium获取iframe内嵌页面的源码
Python3.x:selenium获取iframe内嵌页面的源码 前言 在一些网页中经常会看到ifrmae/frame标签,iframe是嵌入式框架一般用来在已有的页面中嵌入另一个页面,当一个元素在 ...
- 《JAVA程序设计》第五次实验报告
20145333 实验五 Java网络编程及安全 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.05.06 18:30-21:3 ...
- 【纯代码】Swift - 自定义底部弹窗基类(可根据需要自行扩展内容)
//弹窗视图 class PopView : UIView { var selectButtonCallBack:((_ title:String)-> Void)? var contenVie ...
- 在vim中的复制,剪切,粘贴
1. 剪切和粘贴 定位鼠标到剪切的开始位置 输入v键开始选择剪切的字符,或者V键是为了选择 整行 移动方向键到结束的地方 d键是剪切,y键是复制 移动鼠标到粘贴的位置 输入P是在鼠标位置前粘贴,输入p ...
- Caffe学习笔记(二):Caffe前传与反传、损失函数、调优
Caffe学习笔记(二):Caffe前传与反传.损失函数.调优 在caffe框架中,前传/反传(forward and backward)是一个网络中最重要的计算过程:损失函数(loss)是学习的驱动 ...