【C++初阶11-模版进阶】解锁C++模版更多玩法

2023-05-16

今天,带来模版进阶的讲解。
主要讲解:

  • 非类型模版参数
  • 模版的特化
  • 模版的分离编译

文中不足错漏之处望请斧正!


非类型模版参数

模版参数分为类型模版参数和非类型模版参数。

可以这么理解:前者是为了泛化类型,后者给定了实际类型,更像是给类模板所有实例用的一个常量

也有这样的要求:浮点数、类对象以及字符串是不允许作为非类型模板参数的。基本上就是用整形家族来当非类型模版参数。

声明格式

template <整形 参数名 =>
class vector
{};

见见猪跑

template <class T, size_t N = 10>
class vector
{
public:
private:
    T _arr[N]; //大小是静态的数组
};

模版的特化

模版的特化就是模板的特殊实例。

为什么

模板再神通广大也并不能用在所有场景吧?总有那么几个特殊场景。

我们只能像以前那样单独写了吗?单独写可以,但也能用模版的特化解决

怎么玩

函数模版的特化

template<class T>
返回值类型 函数模版名(参数列表)

template<>
返回值类型 特化的函数名<要特化的类型>(参数列表)

见见猪跑

struct test {
    int _i = 1;
};

template<class T>
int toInt(T input) {
    cout << "int toInt(T input)" << endl;
    return (int) input;
}

template<>
int toInt<test>(test input) {
    cout << "int toInt<test>(test input)" << endl;
    return input._i;
}

int main() {
    test t;
    char ch = 'a';

    toInt(t);
    toInt(ch);
    return 0;
}
int toInt<test>(test input)
int toInt(T input)

注意:特化出的实例参数列表必须和模板完全相同。

不过,为了简单方便,遇到函数模版的特殊场景会直接单独提供,这样简单清晰。

类模板的特化

全特化

template<class T1, class T2>
class test {
public:
    test() {
        cout << "template<class T1, class T2> class test " << endl;
    }

    T1 _t1;
    T2 _t2;
};

template<>
class test<int, double> {
public:
    test() {
        cout << "template<> class test<int, double>" << endl;
    }

    int _t1;
    double _t2;
};

int main() {
    test<char, int> t1;
    test<int, double> t2;

    return 0;
}
template<class T1, class T2> class test 
template<> class test<int, double>

半特化(偏特化)

目的1:将参数特化

template<class T1, class T2>
class test {
public:
    test() {
        cout << "template<class T1, class T2> class test " << endl;
    }

    T1 _t1;
    T2 _t2;
};

template<class T1>
class test<T1, int> {
public:
    test() {
        cout << "template<class T1> class test<T1, int>" << endl;
    }

    T1 _t1;
    int _t2;
};

int main() {
    test<char, char> t1;
    test<char, int> t2; //第二个模版参数传了int,就走了特化

    return 0;
}
template<class T1, class T2> class test 
template<class T1> class test<T1, int>

目的2:对参数进一步限制

template<class T1, class T2>
class test {
public:
    test() {
        cout << "template<class T1, class T2> class test " << endl;
    }

    T1 _t1;
    T2 _t2;
};

template<class T1, class T2>
class test<T1 *, T2 *> {
public:
    test() {
        cout << "template<class T1, class T2> class test<T1*, T2*>" << endl;
    }
};

template<class T1, class T2> class test 
template<class T1, class T2> class test<T1*, T2*>

模版的分离编译

核心结论

模版不可以分离编译。

为什么

假如我们分离成这样:

  • add.h
  • main.cpp

add.h中有类模版,main.cpp中用类模板实例出类型,再用类型实例出对象,调用对象的成员函数。

  1. 对象的成员函数对main来说是外部符号,等后续链接
  2. 类模板的成员函数是在调用的时候才实例

即,模板处不知道有人调用就没实例成员函数 && 调用处默认认为外部符号都能直接链接使用 = 链接一个根本没实例出来的函数 = 链接错误

解决办法

  1. 声明定义不分离
  2. 调用处显式实例化类模板的成员函数
//  stack.cpp
#include "stack.h"
template<class T>
void Stack<T>::push(const T& data)
{
    _a[_size++] = data;
}

template<class T>
void Stack<T>::print()
{
    for(int i = 0; i<_size; i++)
    {
        cout << _a[i] << ' ';
    } cout << endl;
}

template class Stack<int>;//在最下面实例化才能实例化到全部模版(顺序编译)

:1

今天的分享就到这里了,感谢您能看到这里。

这里是培根的blog,期待与你共同进步!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++初阶11-模版进阶】解锁C++模版更多玩法 的相关文章

  • 互补滤波器

    互补滤波器 从 RC 电路 到 数字滤波器 参考 xff1a wikiPedia by luoshi006 原理 低通滤波器 一阶低通滤波器 传递函数 常见的 RC 电路构成的一阶低通滤波器的输入 U 输出 Y 关系如下 xff1a Y U
  • mahony 互补滤波器

    by luoshi006 上接 互补滤波器 xff0c 继续学习互补滤波 参考 xff1a Keeping a Good Attitude A Quaternion Based Orientation Filter for IMUs and
  • PX4 - position_estimator_inav

    by luoshi006 参考 xff1a 1 http dev px4 io advanced switching state estimators html 2 http blog sina com cn s blog 8fe4f2f4
  • PX4-terrain_estimator

    by luoshi006 参考 xff1a https github com PX4 Firmware blob master src lib terrain estimation terrain estimator h PX4 位置估计中
  • 已归档博文收纳

    by luoshi006 欢迎交流 个人 Gitter 交流平台 xff0c 点击直达 xff1a L类 Learning GitHub Qt5 5 1 43 OpenCV2 4 10 环境配置PX4 开发环境 xff08 Ubuntu14
  • linux信号量

    1 信号量数据结构 union semun int val 整形变量 信号量初值 struct semid ds buf semid ds结构指针 unsigned short array 数组类型 struct seminfo buf 信
  • 单片机系统中的一种文字平滑(抗锯齿)显示方法

    这是之前一个项目中已实现的方法 xff0c 现在整理后拿出来分享 单片机系统中文字显示部分一般用的是用取模软件取出字模后输出到屏幕上显示 xff0c 这种方式显示的字体有锯齿 xff0c 在DPI低的显示屏上锯齿效果非常明显 对于单色屏来说
  • DIY个人智能家庭网关—— 路由器篇之刷机

    先选择合适的路由器型号 xff0c 要求有两个 xff0c 一 xff1a 有USB口 xff0c 二 xff1a 可以刷openwrt系统 xff0c 我的首选是newifi mini xff0c 比较喜欢折腾的可以刷openwrt官方固
  • 类中的域

    转自http book 51cto com art 201207 350797 htm 类的对象也称为这个类的实例 当创建一个对象时 xff0c 对象包含在类定义中包括的所有域 但是 xff0c 类定义中的域并不总是一样 一共有两种 有一种
  • Postman 插件介绍

    Postman介绍 Postman是google开发的一款功能强大的网页调试与发送网页HTTP请求 xff0c 并能运行测试用例的的Chrome插件 其主要功能包括 xff1a 模拟各种HTTP requests 从常用的 GET POST
  • 【2022阿里灵犀互娱】游戏测开笔试AC_Code

    测开笔试 xff0c 90分钟 xff0c 3道编程题 43 八股 xff0c 第二题输出格式模拟题 xff0c 就不贴了 T1 进制转换 题意 有一个数 xff0c 可能是2 xff5e 16进制的其中之一 xff0c 算出所有可能的结果
  • error while loading shared libraries: libopencv_imgcodecs.so.3.4

    最近给电脑重新安装了opencv3 4 10 xff0c 但是跑工程时却出现这个问题 xff0c 网上百度了一堆 xff0c 发现应该是库设置的问题 xff0c 但是到底是哪里出了问题 xff0c 怎么设置 xff0c 我根据我自己的实际情
  • 六、geotrellis按时间序列存储至hbase

    实现代码如下 xff1a import org apache camel scala dsl builder RouteBuilderSupport import geotrellis raster import geotrellis pr
  • 支持向量机svm及python测试

    from sklearn svm import SVR SVC from sklearn datasets import load boston from sklearn datasets import load wine from skl
  • mlp神经网络及python测试

    关于线性模型 xff1a y 39 61 w 0 x 0 43 w 0 x 0 43 43 w p x p 43 b 其中 xff0c y 39 表示对y的估算值 xff0c x 0 到x p 是样本特征值 w表示每个特征值的权重 xff0
  • linux 安装gdal(含hdf)记录

    一 准备工作 经实践 xff0c 在其他用户下存在某种问题 xff0c 可能是对Centos系统上不熟悉 xff0c 无法解决 xff0c 需在root用户下安装 xff09 xff1a su root 安装编译环境 sudo yum in
  • go语言多线程与并发编程

    go语言并发编程 在了解go语言的并发编程之前 xff0c 我们必须先了解并发和并行的概念 我们知道 xff0c 当启动一个应用的时候实际上是启动了一个进程 xff0c 通过该进程实现资源的调度和分配 xff0c 并且多个进程之间是相互隔离
  • Pycharm 中Available packages nothing to show

    国内源 xff1a 清华 xff1a https pypi tuna tsinghua edu cn simple 阿里云 xff1a http mirrors aliyun com pypi simple 中国科技大学 https pyp
  • 以太坊区块链的区块(Block)结构

    这里以以太坊区块链为基础进行讲解 直接看代码 xff1a 区块结构代码 xff1a block go 1 block的header type Header struct ParentHash common Hash 96 json 34 p

随机推荐

  • go语言连接mongodb数据库

    使用mongodb数据库之前需要先下载安装mongodb服务器端程序 xff0c 这里不再赘述 go语言下使用mongodb步骤如下 xff1a 1 下载mongodb连接驱动mgo 命令行下输入 xff1a go get gopkg in
  • 算法中的常用数学公式

    1 指数 指数是幂运算a a 0 中的一个参数 xff0c a为底数 xff0c n为指数 xff0c 指数位于底数的右上角 xff0c 幂运算表示指数个底数相乘 当n是一个正整数 xff0c a 表示n个a连乘 当n 61 0时 xff0
  • hbase出现org.apache.hadoop.hbase.PleaseHoldException: Master is initializing错误解决

    使用hbase创建namespace和table时提示该错误 xff0c 完整的错误日志如下 xff1a 按照网上的解决思路 xff1a 1 设置主机之间的NTP时间同步 2 修改hbase site xml配置文件 lt property
  • windows下hadoop的部署和使用

    本教程在windows10环境下安装配置hadoop 43 hbase 43 spark 一 下载压缩包 xff1a 1 JavaJDK xff0c 1 8以上 2 Hadoop2 8 3 xff0c 下载地址 xff1a http arc
  • 四、geotrellis发布TMS服务

    本章节将上一章节创建的瓦片发布为TMS服务 本章节将使用akka建立http服务并访问影像瓦片 使用maven构建测试案例 xff0c maven参见上一章节 具体代码如下 xff1a import geotrellis raster im
  • Pyspark实战(四)pyspark操作hbase

    环境配置 xff1a Spark 启动环境中添加 hbase 的 jar 包以及 spark examples的jar包 1 下载spark examples jar包 xff0c 地址https mvnrepository com art
  • 五、geotrellis实现栅格切片并存储至hbase

    部署环境可以参考本栏目的其他章节 1 maven代码如下 xff1a lt dependencies gt lt dependency gt lt groupId gt org apache camel lt groupId gt lt a
  • launch文件和package文件语法

    launch文件语法 参考 xff1a ROS入门之 浅谈launch 沐棋的博客 CSDN博客 roslaunch 补充 xff1a launch prefix 61 command prefix roslaunch 命令 的一个潜在的缺
  • ORB_SLAM2新增稠密建图代码笔记

    接上一篇博客 ORB SLAM2 43 kinect稠密建图实战项目总结 ORB SLAM2 43 kinect稠密建图实战项目总结 好好仔仔的博客 CSDN博客 本篇在此基础上对整个项目的逻辑结构以及代码实现进行梳理 orb slam2新
  • windows下C++学习推荐书籍

    推荐几本书给你们 xff0c 有空可以学习一下 xff1a C 43 43 编程相关 xff1a 1 C 43 43 Primer xff1a C 43 43 的工具书 2 Effective C 43 43 xff1a C 43 43 提
  • stm32IO口八种工作模式详细解析(附原理图)

    目录 工作模式介绍常用IO口工作模式分析实际应用 很多小伙伴们在初学stm32时都对stm32的IO口工作模式的原理和配置不了解 xff0c 所以我整理发表此篇文章作为自己复习和他人参考资料 xff08 注 xff1a 该文章参考了stm3
  • cmake之install总结(指定安装文件和安装位置)

    背景 cmake不仅可以构建可执行文件 xff0c 还可以安装 使用CMake xff0c 我们可以使用install 命令指定安装规则 只需要指定安装位置和待安装的目标文件 xff0c 十分简单 以cmake官方教程为例 xff08 3
  • 工训备赛日志(二)——上位机与stm32之间的一种简易通信方式

    工训备赛日志 xff08 二 xff09 上位机与stm32之间的一种简易通信方式 一 摘要 上位机检测到物体之后 xff0c 要将信号传递给控制底层的STM32 xff0c 这里提出了一种基于读取电平和外部中断的简易通信方式 此方法占用五
  • 【2】中断方式和查询方式的区别

    1 中断方式 xff1a 接收数据时 xff0c MCU转入中断服务程序 xff0c 再处理接收到的数据 xff1b CMT2300A接收数据的中断 xff1a 检测RX FIFO TH 中断 xff0c 一旦有效表示FIFO 已经被填入预
  • Ubantu 安装到VMware详解

    想要在VMware中运行Linux系统 xff0c 那么就需要Linux系统安装到VMware虚拟机上面 在这里 xff0c 以把ubantu16 04安装到VMware虚拟机中为教程进行图文讲解 xff0c 共分为三个步骤 xff0c 分
  • 数字直流电源设计

    设计目标 xff1a 市电输入 开关频率50KHz 60V 20A 1200W输出 输出电压纹波0 2 输出电流纹波20 效率0 8 1 确定输入电压 经查阅 xff0c 我国市电电压标准 xff0c 220V单相供电时 xff0c 为额定
  • CAN报文格式

    CAN协议的报文传输过程中有 数据帧 远程帧 错误帧 过载帧和帧间隔 nbsp nbsp nbsp nbsp nbsp nbsp nbsp 1 数据帧 用于发送节点向接收节点传送数据的帧 nbsp nbsp nbsp nbsp nbsp n
  • FreeRTOS调度器启动

    nbsp 在真正启动调度器之前 先创建空闲任务 初始化一些变量 真正启动调度器的函数是xPortStartScheduler 启动调度器 void vTaskStartScheduler void BaseType t xReturn if
  • 安装novnc,并加入开机自启

    1 安装git工具 apt get install git y 2 下载novnc git clone https github com novnc noVNC 3 ls 查看 xff0c 已经下载完成 4 vim novnc sh把启动命
  • 【C++初阶11-模版进阶】解锁C++模版更多玩法

    今天 xff0c 带来模版进阶的讲解 主要讲解 xff1a 非类型模版参数模版的特化模版的分离编译 文中不足错漏之处望请斧正 xff01 非类型模版参数 模版参数分为类型模版参数和非类型模版参数 可以这么理解 xff1a 前者是为了泛化类型