【C++】模板具体化、实例化、特化整理总结

文章目录

    • 模板具体化
      • 实例化(隐式实例化)
      • 显式实例化
      • 显式具体化(特化)
        • 具体化(全特化)
        • 部分具体化(部分特化、偏特化)

模板的具体化分为隐式实例化)、显式实例化和显式具体化)。 模板以泛型的方式描述函数(类),而具体化是使用具体的类型生成函数(类)声明。
显式实例化和显式具体化的区别在于显式实例化只需要写声明不需要写定义,显式实例化的定义与隐式实例化一样由编译器生成。

模板具体化

实例化(隐式实例化)

而是对于实例化模板参数的每种类型,都从模板产生出一个不同的实体。
这种用具体类型代替模板参数的过程叫做实例化。它产生了一个模板的实例。
编译器使用模板为特定类型生成函数(类)定义时,得到的就是模板实例。

template <typename T>
T const& max (T const& a, T const& b)
{return  a < b ? b : a;
}

实例化其实就是模板最普通的写法

显式实例化

使用关键字template并指出所需类型来声明类时,编译器将生成类声明的显式实例化。
(显示生成一个类型的实例)

template <typename T>
inline T max (T a, T b)
{return  a < b  ?  b : a;
}
template int max<int>(int a, int b);    //显式实例化,指定编译器生成int类型的模板定义
template int max<>(int a, int b);   //简写
template int max(int a, int b); //简写

显式实例化只是一个声明,让编译器用具体的类型生成函数定义或类定义。

用处:
在多文件编译连接时生成实例

//t1.h
template <typename T>
void f(T x);//t1.cpp
#include "te.h"
#include <iostream>
template <typename T>
void f(T x)
{std::cout << x << std::endl;
}
template void f<int>(int);//显式实例化int//main.cpp
#include "te.h"
#include <iostream>int main()
{f(6); //编译成功,输出6//编译失败,undefined reference to `void f<char>(char)'f('6'); return 0;
}

上述代码用显示实例化生成了int的函数而没有生成char的,从而报错char类型的未定义

显式具体化(特化)

函数模板特化指函数模板在模板参数为特定类型下的特定实现
模板的特化和函数类模板的重载类似,你可以依次重写这个函数或者类, 也可以只特化某个成员(片特化),也可以特化整个类(全特化)

具体化(全特化)

在起始处声明一个 template<>,接下来声明用来特化类模板的类型。这个类型被用作模板实参,且必须在类名的后面直接指定

template<> 
class A<int>{....
};

进行类模板的全特化时,每个成员函数都必须重新定义为普通函数,原来模板函数中的每个T也相应地被进行特化的类型取代:

#include <iostream>
//模板
template <typename T>
class A{
public:void get(){std::cout << "common" << std::endl;}
};template<>
class A<int>{
public:void get(){std::cout << "int template" << std::endl;}
};int main()
{A<std::string> a;a.get(); //commonA<int> aa;aa.get(); //int templatereturn 0;
}

注意:
全特化和由模板生成的实例化不能存在于同一个程序中。

template <typename T>
class A {
public:
};template class A<double>;//错误,必须在其首次使用之前对 类 \"A<double>\" 进行显式专用化
template<> 
class A<double> 
{
};
  • 函数模板特化
template<typename T>
int f(T) { return 1; }template<> int f<int>(int) { return 3; }    //完整写法
template<> int f(int) { return 3; } //简写,省略了<int>
部分具体化(部分特化、偏特化)

模板偏特化是模板特化的一种特殊情况,指显示指定部分模板参数而非全部模板参数,或者指定模板参数的部分特性分而非全部特性,也称为模板部分特化。

//类模板
template <typename T1, typename T2>
class MyClass {
...
};//局部特化:两个模板参数具有相同的类型
template <typename T>
class MyClass<T,T> {
...
};//局部特化:第2个模板参数的类型是int
template<typename T>
class MyClass<T,int> {
...
};局部特化:两个模板参数都是指针类型。
template<typename T1,typename T2>
class MyClass<T1*,T2*>{
...
};

调用:

Myclass<int,float> mif;   //使用MyClass<T1,T2>
MyClass<float,float> mff;  //使用MyClass<T,T>
MyClass<float,int>  mfi;   //使用MyClass<T,int>
MyClass<int*,float*> mp;   //使用MyClass<T1*,T2*>

实例

#include <iostream>
#include <string>template <typename T1, typename T2>
class MyClass 
{
public:MyClass(const T1& t1, const T2& t2) { std::cout << "111: " << t1 << std::endl; }
};//显示具体化、特化
template<>
class MyClass<std::string, std::string>
{
public:MyClass(const std::string& t1, const std::string& t2) { std::cout << "222 : " << t1 << std::endl; }
};//部分特化
template <typename T1>
class MyClass<T1, double> 
{
public:MyClass(const T1& t1, const double& t2) { std::cout << "333 : " << t1 << std::endl; }
};//显示实例化
template class MyClass<std::string, int>;int main()
{MyClass<char[3],std::string> class2("s2", "s22"); MyClass<std::string,std::string> class3("s3", "s33"); MyClass<std::string,double> class4("s4", 3.14); return 0;
}

输出

111: s2
222 : s3
333 : s4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/219658.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【密码学】RSA破解方法汇总(PYTHON实现)

源自于密码学的一次大作业~ RSA破解 &#x1f4a1; Alice使用的RSA密码体制&#xff0c;有以下事项需要说明&#xff1a; 1&#xff09; 模数&#x1d441;&#x1d45d;&#x1d45e;规模为1024比特&#xff0c;其中&#x1d45d;&#xff0c;&#x1d45e;为素数&#xff1…

Java项目学生管理系统六后端补充

班级管理 1 班级列表&#xff1a;后端 编写JavaBean【已有】编写Mapper【已有】编写Service编写controller 编写Service 接口 package com.czxy.service;import com.czxy.domain.Classes;import java.util.List;/*** author 桐叔* email liangtongitcast.cn* description*/ p…

【Jenkins】Centos环境安装Jenkins(通过rpm安装)

在Centos操作系统中通过rpm安装Jenkins 参考官网 https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos 1、下载安装Jdk17 下载安装 # 更新您的系统&#xff0c;不一定需要 # sudo yum -y update # 安装将用于下载 Java 17 二进制文件的 wget 命令行工具。 s…

计算机网络传输层(期末、考研)

计算机网络总复习链接&#x1f517; 目录 传输层的功能端口UDP协议UDP数据报UDP的首部格式UDP校验 TCP协议&#xff08;必考&#xff09;TCP报文段TCP连接的建立TCP连接的释放TCP的可靠传输TCP的流量控制零窗口探测报文段 TCP的拥塞控制慢开始和拥塞控制快重传和快恢复 TCP和U…

薅github的羊毛-用pages建自己的博客或静态资源站 - 1/2

注册帐号 准备邮箱注册帐号&#xff0c;在注册界面输入用户名、邮箱及密码完成注册。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 1. 在注册成过程中&#xff0c;会往邮箱发送验证码&#xff0c;请如实填写即可 2. 验证码没错的话&#xff0c;就代…

AUTOSAR从入门到精通-面向服务的中间件SOME/IP(一)

目录 前言 几个相关概念 几个高频面试题目 SOME/IP 与 CAN 的不同? 通信速度

JavaScript询问gpt:如何合并数组?

如何合并数组&#xff1f; 在 JavaScript 中&#xff0c;你可以使用多种方法来合并数组。以下是一些常见的方法&#xff1a; 1. 使用 concat() 方法&#xff1a; javascript const array1 [1, 2, 3]; const array2 [4, 5, 6]; const mergedArray array1.concat(…

【Maven】加载 Maven 项目报错 status code: 501, reason phrase: HTTPS Required (501)

问题描述 加载 Maven 项目报错&#xff0c;错误信息如下&#xff1a; status code: 501, reason phrase: HTTPS Required (501)尝试使用 -U 标记(强制更新快照)运行 Maven 导入原因分析 这个错误通常表示 Maven 在尝试从远程仓库下载依赖时遇到了 HTTPS 必需的错误。 解决方…

案例:xpath实例+功能

素材&#xff1a;test.html 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>Title</title></head><body><span>我爱你</span><ul><li…

Mac配置环境变量不生效

Mac配置环境变量不生效 Mac中的环境变量介绍 Mac系统的环境变量&#xff0c;加载顺序为&#xff1a; /etc/profile /etc/paths ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc 当然/etc/profile和/etc/paths是系统级别的&#xff0c;系统启动就会加载&#xff0c;后面…

将自己的django项目部署到云服务器(腾讯云centos)

最近自己买了个云服务玩&#xff0c;突然就想把自己写的小项目部署到云服务器上&#xff0c;这样就可以实现公网访问了。以下是整个部署过程和遇到的各种问题的解决方案&#xff0c;有想自己部署自己功能的&#xff0c;可以参考着进行哦。 1、设置好腾讯云的远程登录代码 先给…

HarmonyOS(二)—— 初识ArkTS开发语言(下)之ArkTS声明式语法和组件化基础

前言&#xff1a; 通过前面ArkTS开发语言&#xff08;上&#xff09;之TypeScript入门以及ArkTS开发语言&#xff08;中&#xff09;之ArkTS的由来和演进俩文我们知道了ArkTS的由来以及演进&#xff0c;知道了ArkTS具备了声明式语法和组件化特性&#xff0c;今天&#xff0c;搭…

倾角仪(xyz)理解

第一列是初始值 x更小&#xff0c;说明往左倾 x更大&#xff0c;说明往右倾 z更大、y更大&#xff0c;说明往后倾 z更小、y更大&#xff0c;说明往前倾

[Unity+文心知识库]使用百度智能云搭建私有知识库,集成知识库API,打造具备知识库的AI二次元姐姐

1.简述 最近从百度智能云的官方技术支持那边了解到&#xff0c;目前百度千帆大模型平台提供有在线的知识库功能&#xff0c;能够在线上传自己的私人知识库文档&#xff0c;并且配置文心一言模型作为文本生成的引擎&#xff0c;构建自己的私有知识库。之前自己搭建知识库都是用的…

VPN 在网络安全中的应用

虚拟专用网络&#xff08;Virtual Private Network&#xff0c;VPN&#xff09;是指利用不安全的公共网络如 Internet 等作为传输媒介&#xff0c;通过一系列的安全技术处理&#xff0c;实现类似专用网络的安全性能&#xff0c;保证重要信息的安全传输的一种网络技术。 1&#…

【网络安全技术】电子邮件安全PGP,SMIME

一、PGP&#xff08;Pretty Good Privacy&#xff09; PGP是一种邮件加密手段&#xff0c;他在发邮件一方加密&#xff0c;然后发给发送方邮件服务器&#xff0c;发送方邮件服务器再发送给接收方邮件服务器&#xff0c;然后接收方再从接收方邮件服务器pop出来&#xff0c;这整…

【Python爬虫】Python爬虫入门教程注意事项

1 引言 随着互联网的快速发展&#xff0c;网络数据已经成为人们获取信息的重要来源。而爬虫技术作为获取网络数据的重要手段&#xff0c;越来越受到人们的关注。在众多编程语言中&#xff0c;Python因其易学易用、库丰富、社区活跃等优势&#xff0c;成为爬虫开发的首选。本文将…

python和pygame实现烟花特效

python和pygame实现烟花特效 新年来临之际&#xff0c;来一个欢庆新年烟花祝贺&#xff0c;需要安装使用第三方库pygame&#xff0c;关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520 效果图及源码 先看效果图&#xff1a…

共建开源新里程:北京航空航天大学OpenHarmony技术俱乐部正式揭牌成立

12月11日,由OpenAtom OpenHarmony(以下简称“OpenHarmony”)项目群技术指导委员会(以下简称“TSC”)和北京航空航天大学共同举办的“OpenHarmony软件工程研讨会暨北京航空航天大学OpenHarmony技术俱乐部成立仪式”在京圆满落幕。 现场大合影 活动当天,多位重量级嘉宾出席了此次…

PostgreSQL DBA之数据库指标监控

常规监控 连接数使用超过95%告警&#xff0c;最大连接数和当前连接数 select (select count(*) from pg_stat_activity) /(select setting from pg_settings where name max_connections) ::numeric >0.95; 存在空闲连接idle in transaction大于5秒的连&#xff0c;如果长…