C++ 模板函数特化与重载

2023-10-26

如果程序里有普通模板,模板特化版本,和普通函数,那么程序优先选择普通函数。下面的程序里面打印"normal func"。

#include <iostream>
using namespace std;

template<typename T>
T func(T a, T b) {
    cout << "template<T> func" << endl;
    return a + b;
}

template<>
int func(int a, int b) {
    cout << "template<> func" << endl;
    return a + b;
}

int func(int a, int b) {
    cout << "normal func" << endl;
    return a + b;
}

int main() {
    int a = 3, b = 4;
    cout << func(3, 4) << endl;

    return 0;
}

如果没有普通函数,那么程序会选择模板特化版本。打印"template<> func"。
如果没有模板特化版本,那么程序会选择普通模板。打印"template<T> func“。

 

下面引用自https://blog.csdn.net/K346K346/article/details/82179205

使用普通函数重载和使用模板特化还是有不同之处,主要表现在如下两个方面:
(1)如果使用普通重载函数,那么不管是否发生实际的函数调用,都会在目标文件中生成该函数的二进制代码。而如果使用模板的特化版本,除非发生函数调用,否则不会在目标文件中包含特化模板函数的二进制代码。这符合函数模板的“惰性实例化”准则。
(2)如果使用普通重载函数,那么在分离编译模式下,需要在各个源文件中包含重载函数的申明,否则在某些源文件中就会使用模板函数,而不是重载函数。

另外,个人补充一点,模板特化版本还是模板,必须放到头文件里面。普通函数重载得放在.c和.cpp里面。
 

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

C++ 模板函数特化与重载 的相关文章

随机推荐

  • imac 网络安装系统 服务器时间,Mac 重装系统教程(二):网络在线重装

    哈喽 大家好 我是麦壳菌 昨天给大家分享了 Mac 重装系统教程 系列的第一篇 Mac 在哪些情况下需要重装系统 今天分享第二篇 网络在线重装 重装系统的方法分为 网络在线重装 和 U盘引导重装 网络在线重装 开机时 通过快捷键进入Mac
  • Python入门教程:超详细1小时学会Python

    1 Hello world 安装完Python之后 打开IDLE Python GUI 该程序是Python语言解释器 你写的语句能够立即运行 我们写下一句著名的程序语句 并按回车 你就能看到这句被K R引入到程序世界的名言 在解释器中选择
  • 【Unity基础】3.脚本控制物体运动&天空盒

    Unity基础 3 脚本控制物体运动 天空盒 大家好 我是Lampard 欢迎来到Unity基础系列博客 所学知识来自B站阿发老师 感谢 一 搭建开发环境 1 下载visual studio 在我们下载unity编译器的时候 会让我们选择当
  • 返回链表的中间结点

    返回链表的中间结点 给定一个带有头结点 head 的非空单链表 返回链表的中间结点 如果有两个中间结点 则返回第二个中间结点 用快慢指针来写 Node Fast Node Slow 先初始化 让Fast和Slow都指向第一个链表节点 然后让
  • 【延期召开】2022年网络与信息安全国际会议(NISecurity 2022)

    2022年网络与信息安全国际会议 NISecurity 2022 重要信息 会议网址 www nisecurity org 会议时间 2022年7月22 24日 召开地点 中国 杭州 截稿时间 2022年6月20日 录用通知 投稿后2周内
  • STM32 CAN总线故障检测功能的使用

    STM32 中的CAN总线模块是具有故障监测功能的 就是CANx SCE IRQHandler 这个用的很少 它叫CAN总线状态改变中断 通过打开这个中断 配合代码可以精确的监测CAN总线的故障情况 就是监测对应CAN的ESR寄存器 可以使
  • 常见开源协议介绍

    一 常用开源协议汇总图 首先从一张图开始 介绍几种主流的开源协议 以及决定选用哪种框架的思路 使用哪种开源协议 决定了你发布的开源项目被别人使用了之后 别人的项目是否受到你的项目的开源协议的约束 受到哪种约束 同理 采用别人的开源项目时 也
  • 虚拟机启动报错 :你的设备遇到问题,需要重启。我们只收集某些错误信息,然后为你重新启动......

    解决办法 1 禁用Hyper V 2 禁用Windows虚拟机监控程序平台 3 启用虚拟机平台
  • 利用队列进行数字排序

    OpenJudge利用队列进行数字排序 题目 描述 对于N个数字 有人提出了如下的排序策略 例如 对于数字53 47 85 38 64 23 先建立10个队列 0到9 用于存放数字的大小 将这N个数字依个位存放入各自的队列之中 然后再按队列
  • 免费在线PDF解密

    更好用 传送门
  • LLVM 与 Clang;IR 与AST

    关于LLVM和clang 要说回编译器的组成部分 一 编译器的组成 传统编译器通常由三部分组成 分别是前端 frontEnd 优化器 frontEnd 和 后端 backEnd 在编译过程中 前端主要负责词法 语法分析和语义分析 将源代码转
  • tq210项目启动

    ok210的板子太烂了 居然连jtag口都没有 导致uboot到linux kernel启动调试半天也找不到原因 这次买了这个带jtag的板子 终于可以调试了 有了ok210的经验 这次应该会比较顺利吧 按照原来的打算 先移植uboot d
  • JSONView下载安装

    JSONView下载安装 JSONView概述 JSONView下载 JSONView安装 JSONView测试 JSONView概述 JSONView是一款非常好用的Json格式查看器 在日常开发调试中经常会遇到Json格式的数据需要解析
  • 数据结构之概念,算法,线性表概述

    前言 数据结构在我们编程的过程中是不可避免要遇到的 我们可以去通过学习而选择更高效的数据结构 进而减少我们对内存使用 带来更高的储存效率 基本概念 数据结构为数据 结构 基本操作的结合 数据 数据分为两类 分别为数值型数据和非数值型数据 数
  • 编译过程报错(No rule to make target)

    报错内容 The error make 2 No rule to make target usr lib x86 64 linux gnu libpcl common so needed by range image visualizati
  • C. Recover an RBS

    题目链接 题意 就是给出一个括号序列 其中只包含 这里 可以为 或 问是否该序列是只有一个正确的括号序列 题中保证每个字符串至少有一种正确的括号序列 题解 我们可以分析此题的几个性质 1 题中保证至少有一种正确的括号序列 所以不用去考虑不存
  • 猿创征文

    猿创征文 国产数据库实战之TiDB 数据库快速入门 一 系统检查 1 检查系统版本 2 查看本地IP地址 3 TiDB集群介绍 二 快速部署本地测试集群 1 安装 TiUP工具 2 声明全局环境变量 3 快速部署TiDB 集群 三 连接 T
  • 在ubuntu16.04下安装ElasticSearch-head

    1 安装最新版的nodejs和npm 1 1安装nvm 1 1 1使用git下载对应的包 git clone https github com creationix nvm git nvm cd nvm git checkout git d
  • 关于css 中的visibility属性

    关于css中的visibility属性 就在于是否对用户可见 代码小实例
  • C++ 模板函数特化与重载

    如果程序里有普通模板 模板特化版本 和普通函数 那么程序优先选择普通函数 下面的程序里面打印 normal func include