C++模板心得
C++模板心得
我开始学模板的时候一脸懵逼,真的看不懂模板是怎么作用的。因为大多数人的代码把模板声明和函数、类的声明分行写,让我以为模板的作用是全局的,实际上应该像如下理解。
函数模板
template <class type> type func-name(parameter list){
// function body
}
模板类
template <class type> class class-name {
// code here
}
template < class T >和template < typename T>没有区别(除了在套娃的时候)
在头文件中定义模板类时,在实现时要写出作用域。实例化的时候,要填入其类型。
// in header file
template <class T>
class Pen{
private:
T price, span;
public:
Pen(T a, T b): price(a), span(b){ }
T buyPen();
}; // in source file
template <class T>
T Pen<T>::buyPen(){ // attention to scope declaration
// code here
} int main(){
Pen<int> pilot(1500, 10); // declate the template type
return 0;
}
模板的特殊化
如果在一个模板类中,我们想对某些特定类型数据做特殊处理要怎么办?如下
// for regular data type
template <class T>
class Myclass{
public:
Myclass(T x){
cout << x << " is not a char" << endl;
}
};
// for specific data type
template <>
class Myclass<char>{
public:
Myclass(char x){
cout << x << " is a char" << end;
}
};
首先,我们注意到在特殊化模板里,我们采用了template<>,包含了空的参数。这是在此之前,这个类已有模板类,所有数据类型都应该是可以代入的,所以这里不需要填入任何类型的参数。但是我们需要在后面的类声明中,注意这个< char>,这是尖括号中特殊的参数,表示这个类只有模板数据类型传入的是char才会运行下面的代码。
我们称第一种为通用模板类,第二种为特殊化。
模板函数的特殊化
同样,模板函数也可以特殊化
假如,我先有个泛型函数如下
template <class T>
T test(T& x){
return x + 1;
}
这个函数,对于传入的T为int, double, char等等大多数数据类型都是可以实现的。
但是如果我传入的参数是字符串或者布尔值的话,那么编译器就会报错。
因为它没法给string+1,所以为了可以接收string,我们为string类型专门实现特殊化。
template <>
string test(string& x){
return x + "1";
}
和模板类的特化格式差不多,但是区别在于,模板函数的特化必须从头到尾指明返回的类型和传参的类型,不能再带有泛化内容(T)。
C++模板心得的更多相关文章
- C#模板设计模式使用和学习心得
模板设计模式: 模版方法模式由一个抽象类和一个(或一组)实现类通过继承结构组成,抽象类中的方法分为三种: 抽象方法:父类中只声明但不加以实现,而是定义好规范,然后由它的子类去实现. 模版方法:由抽象类 ...
- *关于httl开源Java模板的使用心得
1.简介 HTTL (Hyper-Text Template Language) 是一个高性能的开源JAVA模板引擎, 适用于动态HTML页面输出, 可替代JSP页面, 指令和Velocity相似. ...
- C++11模板类使用心得
1.推荐使用std::shared_ptr<TaskT>代替指针TaskT*使用,shared_ptr是一种智能指针,能自主销毁释放内存,在c++11中被引入,在多线程编程中有很大的用处, ...
- 前端模板artTemplate,handlerbars的使用心得
写前端页面肯定离不开模板渲染,就近期项目中用的两个前端模板做一些使用总结,顺便复习一下,也方便后面温故. 1,artTemplate 优点: 1,一般web端用得较多,执行速度通常是 Mustache ...
- office开发心得——基于模板开发
这几天正在写一个小程序,但用到生成word表格和Excel表格.到网上查了一些资料,发现如果生成表格模板相对比较固定即可把其制作成模板,需要设置什么格式可以直接在模板中设置,而程序仅需替换相应的内容即 ...
- ActiveMQ学习心得:连接池的简单实现和模板模式的应用
一.安装activemq 下载地址:https://archive.apache.org/dist/activemq/5.13.0/apache-activemq-5.13.0-bin.zip 下载完 ...
- thinkphp3.2.3+smarty解决success调用模板错误心得
最近学习thinkphp上瘾,出现success找不到模板问题,查阅各大神解决方案,分享一下针对新手如何解决该问题,如有不对的地方请大神指正 1.首先修改自己的config文件,添加如下配置代码:// ...
- 我的MYSQL学习心得(一) 简单语法
我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- 【Java心得总结四】Java泛型下——万恶的擦除
一.万恶的擦除 我在自己总结的[Java心得总结三]Java泛型上——初识泛型这篇博文中提到了Java中对泛型擦除的问题,考虑下面代码: import java.util.*; public clas ...
随机推荐
- windows7免费永久激活方法分享
前言 我相信,这里肯定有看过我上一篇博客的同学. 我说了,为解决windows7激活问题,我会找一个比较好的方法. 首先先让大家看一看激活前windows7的计算机属性: 显示是未激活的.下面就是方法 ...
- layui的form表单的checkbox全选与全不选问题
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <m ...
- 在Servlet端获取html页面选中的checkbox值,request获取页面checkbox(复选框)值
html端代码: 选项框: <input type="checkbox" name="crowd" value="选项一">选项 ...
- 【Weiss】【第03章】练习3.4、3.5:有序链表求交、并
[练习3.4] 给定两个已排序的表L1和L2,只使用基本的表操作编写计算L1∩L2的过程. [练习3.5] 给定两个已排序的表L1和L2,只使用基本的表操作编写计算L1∪L2的过程. 思路比较简单,测 ...
- 【简说Python WEB】数据库
目录 [简说Python WEB]数据库 数据库表 docker安装MySQL Flask-SQLAlchemy操纵MySQL数据库 初始化 定义模型 定义关系 数据库的CRUD操作 创建表 inse ...
- 什么是EIP、ESP、EBP
堆栈是一种简单的数据结构,是一种只允许在其一端进行插入或删除的线性表.允许插入或删除操作的一端称为栈顶,另一端称为栈底,对堆栈的插入和删除操作被称入栈和出栈.有一组CPU指令可以实现对进程的内存实现堆 ...
- SCF(SenparcCoreFramework) 系列教程(一):项目介绍及快速搭建
2020年3月25日的“盛派周三分享”活动首次使用直播的方式与大家见面,共有 500 多人参与了活动,得到了众多开发者的好评,并强烈要求我分享 PPT,这点要求当然必须满足啦! 除此以外,还有许多开发 ...
- demo08-js条件运算符
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Matplotlib 精简实例入门
Matplotlob 简明实例入门 通过几个实例,快速了解matplotlib.pyplot 中最为常见的折线图,散点图,柱状图,直方图,饼图的用法 如果您需要更为详细的内容,请参考官方文档: htt ...
- PS2手柄在arduino上进行测试,可用,供喜欢diy的朋友借鉴
#include <PS2X_lib.h> //PS2手柄PS2X ps2x; // create PS2 Controller Class//////////PS2引脚///////// ...