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 的多表链接 查 ...
随机推荐
- 如何注册iClap账号?
iClap是一个以产品为基础,集成员工日常所需工具,打通项目工作流程,实现员工自我工作管理.项目管理和企业管理三个体系协同的管理规范系统. 工具/原料 iPhone/Android/浏览器 Teamb ...
- Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2) C Voltage Keepsake
地址:http://codeforces.com/contest/801/problem/C 题目: C. Voltage Keepsake time limit per test 2 seconds ...
- maven install jdk版本自动降为1.7
开发过程中遇到了一个奇怪的现象. IDEA中所有的设置都改成了1.8,但是在执行maven install时却自动降为1.7,报错提示: [ERROR] Failed to execute goal ...
- centos下删除名称为乱码的文件
1.通过ls -li 获取要删除乱码文件名文件的inode号,比如得到的是 146506
- 20145316《Java程序设计》第七周学习总结
20145316<Java学习程序设计>第七周学习总结 教材学习知识总结 1.在只有Lambda表达式的情况下,参数的类型必须写出来. 2.Lambda表达式本身是中性的,同样的Lambd ...
- iOS开发之plist文件操作
之前在想用代码去实现很多界面上能用interface builder可以拖进去的功能,现在想想真是够无知的啊.不仅效率低下,而且对于代码的维护带来不少麻烦,这段时间一直在反思看了design+code ...
- 谷歌技术"三宝"之BigTable(转)
原文地址: http://blog.csdn.net/opennaive/article/details/7532589 2006年的OSDI有两篇google的论文,分别是BigTable和Ch ...
- Java如何清空数组、对象
//清空 public class Clear { public static void main(String[] args){ // List<String> a= new Array ...
- Java基础东西(按位操作运算)
http://aokunsang.iteye.com/blog/615658 前奏: 昨天一哥们问我Java位移你会吗,我说不会,想想位移这么麻烦,一般有位移的Java代码一律不看,有几个人会啊, ...
- MR案例:链式ChainMapper
类似于Linux管道重定向机制,前一个Map的输出直接作为下一个Map的输入,形成一个流水线.设想这样一个场景:在Map阶段,数据经过mapper01和mapper02处理:在Reduce阶段,数据经 ...