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++模板心得的更多相关文章

  1. C#模板设计模式使用和学习心得

    模板设计模式: 模版方法模式由一个抽象类和一个(或一组)实现类通过继承结构组成,抽象类中的方法分为三种: 抽象方法:父类中只声明但不加以实现,而是定义好规范,然后由它的子类去实现. 模版方法:由抽象类 ...

  2. *关于httl开源Java模板的使用心得

    1.简介 HTTL (Hyper-Text Template Language) 是一个高性能的开源JAVA模板引擎, 适用于动态HTML页面输出, 可替代JSP页面, 指令和Velocity相似. ...

  3. C++11模板类使用心得

    1.推荐使用std::shared_ptr<TaskT>代替指针TaskT*使用,shared_ptr是一种智能指针,能自主销毁释放内存,在c++11中被引入,在多线程编程中有很大的用处, ...

  4. 前端模板artTemplate,handlerbars的使用心得

    写前端页面肯定离不开模板渲染,就近期项目中用的两个前端模板做一些使用总结,顺便复习一下,也方便后面温故. 1,artTemplate 优点: 1,一般web端用得较多,执行速度通常是 Mustache ...

  5. office开发心得——基于模板开发

    这几天正在写一个小程序,但用到生成word表格和Excel表格.到网上查了一些资料,发现如果生成表格模板相对比较固定即可把其制作成模板,需要设置什么格式可以直接在模板中设置,而程序仅需替换相应的内容即 ...

  6. ActiveMQ学习心得:连接池的简单实现和模板模式的应用

    一.安装activemq 下载地址:https://archive.apache.org/dist/activemq/5.13.0/apache-activemq-5.13.0-bin.zip 下载完 ...

  7. thinkphp3.2.3+smarty解决success调用模板错误心得

    最近学习thinkphp上瘾,出现success找不到模板问题,查阅各大神解决方案,分享一下针对新手如何解决该问题,如有不对的地方请大神指正 1.首先修改自己的config文件,添加如下配置代码:// ...

  8. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  9. 【Java心得总结四】Java泛型下——万恶的擦除

    一.万恶的擦除 我在自己总结的[Java心得总结三]Java泛型上——初识泛型这篇博文中提到了Java中对泛型擦除的问题,考虑下面代码: import java.util.*; public clas ...

随机推荐

  1. windows7免费永久激活方法分享

    前言 我相信,这里肯定有看过我上一篇博客的同学. 我说了,为解决windows7激活问题,我会找一个比较好的方法. 首先先让大家看一看激活前windows7的计算机属性: 显示是未激活的.下面就是方法 ...

  2. layui的form表单的checkbox全选与全不选问题

    <!DOCTYPE html> <html> <head>     <meta charset="utf-8">     <m ...

  3. 在Servlet端获取html页面选中的checkbox值,request获取页面checkbox(复选框)值

    html端代码: 选项框: <input type="checkbox" name="crowd" value="选项一">选项 ...

  4. 【Weiss】【第03章】练习3.4、3.5:有序链表求交、并

    [练习3.4] 给定两个已排序的表L1和L2,只使用基本的表操作编写计算L1∩L2的过程. [练习3.5] 给定两个已排序的表L1和L2,只使用基本的表操作编写计算L1∪L2的过程. 思路比较简单,测 ...

  5. 【简说Python WEB】数据库

    目录 [简说Python WEB]数据库 数据库表 docker安装MySQL Flask-SQLAlchemy操纵MySQL数据库 初始化 定义模型 定义关系 数据库的CRUD操作 创建表 inse ...

  6. 什么是EIP、ESP、EBP

    堆栈是一种简单的数据结构,是一种只允许在其一端进行插入或删除的线性表.允许插入或删除操作的一端称为栈顶,另一端称为栈底,对堆栈的插入和删除操作被称入栈和出栈.有一组CPU指令可以实现对进程的内存实现堆 ...

  7. SCF(SenparcCoreFramework) 系列教程(一):项目介绍及快速搭建

    2020年3月25日的“盛派周三分享”活动首次使用直播的方式与大家见面,共有 500 多人参与了活动,得到了众多开发者的好评,并强烈要求我分享 PPT,这点要求当然必须满足啦! 除此以外,还有许多开发 ...

  8. demo08-js条件运算符

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. Matplotlib 精简实例入门

    Matplotlob 简明实例入门 通过几个实例,快速了解matplotlib.pyplot 中最为常见的折线图,散点图,柱状图,直方图,饼图的用法 如果您需要更为详细的内容,请参考官方文档: htt ...

  10. PS2手柄在arduino上进行测试,可用,供喜欢diy的朋友借鉴

    #include <PS2X_lib.h> //PS2手柄PS2X ps2x; // create PS2 Controller Class//////////PS2引脚///////// ...