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. 看完这篇 HTTPS,和面试官扯皮就没问题了

    下面我们来一起学习一下 HTTPS ,首先问你一个问题,为什么有了 HTTP 之后,还需要有 HTTPS ?我突然有个想法,为什么我们面试的时候需要回答标准答案呢?为什么我们不说出我们自己的想法和见解 ...

  2. linux firewalld 防火墙操作命令

    查看防火墙的状态systemctl status firewalldTomcat默认使用8080端口,如果防火墙开启,需要开通8080端口firewall-cmd --zone=public --ad ...

  3. Linux命令之解压缩命令tar,zip,rar

    一.tar命令 1.压缩命令 1)压缩为.tar格式 tar -cvf destination.tar source 2)压缩为.tar.gz格式 tar -cvf destination.tar.g ...

  4. 实验三——NFS服务器配置

    实验三——NFS服务器配置 实 验 基 本 信 息 实验名称:NFS服务器配置(3学时) 实验时间:    年 月 日 实验地点:   信工606实验室 同组同学: 实验目的: 了解NFS服务的基本原 ...

  5. vscode使用cnpm报错

     1.在wind10搜索框里输入 Windows PowerShell 进入这个界面 2.打开Windows PowerShell 之后 输入命令:set-ExecutjionPolicy Remot ...

  6. gradle管理的Springboot使用JSP详解

    大家知道现在的springboot默认经不支持jsp了,但是还是可以用的,需要加一些配置. 我使用的springboot是用gradle构造的,现在跟着我一步步来吧! 一,新建一个springBoot ...

  7. tensorflow一些API的基本理解

    1.tf.Session self._session = None opts = tf_session.TF_NewSessionOptions(target=self._target, config ...

  8. [模拟] Codefroces 1175B Catch Overflow!

    题目:http://codeforces.com/contest/1175/problem/B B. Catch Overflow! time limit per test 1 second memo ...

  9. OpenCV-Python 图像金字塔 | 二十

    目标 在本章中, 我们将学习图像金字塔 我们将使用图像金字塔创建一个新的水果"Orapple" 我们将看到以下功能:cv.pyrUp(),cv.pyrDown() 理论 通常,我们 ...

  10. OpenCV-Python 轨迹栏作为调色板 | 九

    目标 了解将轨迹栏固定到OpenCV窗口 您将学习以下功能:cv.getTrackbarPos,cv.createTrackbar等. 代码演示 在这里,我们将创建一个简单的应用程序,以显示您指定的颜 ...