模板的完全特例化和部分特例化

2023-11-20

介绍

  • 完全特例化就是类型完全明确的版本

  • 而部分特例化指的是,只知道是几个参数的函数而不知道参数的类型,或者是只知道是引用或者是指针类型,而不知道具体是char* 还是 int*

模板特例化实例1

template<typename T>
class Vector
{
public:
	Vector() { cout << "call Vector template init" << endl; }

};

// 对char * 提供完全特例化版本
template<>
class Vector<char*>
{
public:
	Vector() { cout << "call Vector<char*> init" << endl; }
};

// 对【指针类型】提供的部分特例化版本
template<typename Ty>
class Vector<Ty*>
{
public:
	Vector() { cout << "call Vector<Ty*> init" << endl; }
};

// 对一个函数指针(指向一个有两个返回值的函数)提供部分特例化
template<typename R, typename A1, typename A2>
class Vector<R(*)(A1, A2)>
{
public:
	Vector() { cout << "call Vector<R(*)(A1, A2)> init" << endl; }
};

// 对一个有 两个返回值的函数 提供部分特例化
template<typename R, typename A1, typename A2>
class Vector<R(A1, A2)>
{
public:
	Vector() { cout << "call Vector<R(A1, A2)> init" << endl; }
};

int sum(int a, int b) { return a + b; }
int main()
{
	// 会默认使用最接近的特例化
	Vector<int> vec1;
	Vector<char*> vec2;
	Vector<int*> vec3;
	Vector<int(*)(int, int)> vec4;
	Vector<int(int, int)> vec5;

	// PFUNC1函数指针类型
	typedef int(*PFUNC1)(int, int);
	PFUNC1 pfunc1 = sum;
	cout << pfunc1(20, 21) << endl;

	// PFUNC2函数类型
	typedef int PFUNC2(int, int);
	PFUNC2 *pfunc2 = sum;  // 函数名就是函数指针
	cout << pfunc2(20, 21) << endl;
	return 0;
}

模板特例化实例2

int sum(int a, int b) { return a + b; }

template<typename T>
void func(T a)
{
	// 查看类型
	cout << typeid(T).name() << endl;
}

// 部分特例化
template<typename R, typename A1, typename A2>
void func2(R (*a)(A1, A2))
{
	cout << typeid(R).name() << endl;
	cout << typeid(A1).name() << endl;
	cout << typeid(A2).name() << endl;
}

class Test
{
public:
	int sum(int a, int b) { return a + b; }
};

// 对成员函数指针进行部分特化
template<typename R, typename T, typename A1, typename A2>
void func3(R(T::*a)(A1, A2))
{
	cout << typeid(R).name() << endl;
	cout << typeid(T).name() << endl;
	cout << typeid(A1).name() << endl;
	cout << typeid(A2).name() << endl;
}

int main()
{
	func(10); // int
	func("sdk"); // const char *
	func(sum); // int(*)(int, int)
	func2(sum); // int int int
	func3(&Test::sum); // int class Test int int

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

模板的完全特例化和部分特例化 的相关文章

  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • 通过增加索引之和来生成排序组合的有效方法

    对于启发式算法 我需要一个接一个地评估特定集合的组合 直到达到停止标准 由于它们很多 目前我正在使用以下内存高效迭代器块生成它们 受到 python 的启发 itertools combinations http docs python o
  • clang 格式换行符在错误的位置

    给出以下代码行 get abc manager get platform status abc platform status sw update status fill update status actions allowed stat
  • 在 VS2017 下使用 Conan 和 CMake 项目进行依赖管理

    我正在尝试使用 CMake 与 VS2017 集成为 C 设置一个开发环境 以便在 Linux x64 下进行编译 为了更好地管理依赖关系 我选择使用 Conan 但我对这个软件还很陌生 我想知道让 VS2017 识别项目依赖关系的最佳方法
  • 如何使用 zlib 制作 .zip 文件

    我正在阅读zlib的文档 它相当详细 但我读到了这一行 输出数据将位于zlib格式 与 gzip 或zip formats http www zlib net zlib how html http www zlib net zlib how
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • mprotect 之后 malloc 导致分段错误

    在使用 mprotect 保护内存区域后第一次调用 malloc 时 我遇到分段错误 这是执行内存分配和保护的代码片段 define PAGESIZE 4096 void paalloc int size Allocates and ali
  • 对 boost 库的依赖项没有完整路径

    我已经成功构建了动态库 依赖于使用自定义前缀构建和安装的 boost 库 b2 install prefix PREFIX 然而 当我跑步时otool L在我的库中 我得到如下输出 libboost regex dylib compatib
  • 如何在 C++ 中将 CString 转换为 double?

    我如何转换CString to a double在 C 中 Unicode 支持也很好 Thanks A CString可以转换为LPCTSTR 这基本上是一个const char const wchar t 在 Unicode 版本中 知
  • 为什么 clang 使用 -O0 生成低效的 asm(对于这个简单的浮点和)?

    我正在 llvm clang Apple LLVM 版本 8 0 0 clang 800 0 42 1 上反汇编此代码 int main float a 0 151234 float b 0 2 float c a b printf f c
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • 预处理后解析 C++ 源文件

    我正在尝试分析c 使用我定制的解析器的文件 写在c 在开始解析之前 我想摆脱所有 define 我希望源文件在预处理后可以编译 所以最好的方法是运行C Preprocessor在文件上 cpp myfile cpp temp cpp or
  • tabcontrol selectedindex 更改事件未被触发 C#

    嘿伙计们 我有一个很小的问题 请参阅下面的代码 this is main load private void Form1 Load object sender EventArgs e tabAddRemoveOperator Selecte
  • asp.net网格分页的SQL查询

    我在用iBatis and SQLServer 使用偏移量和限制进行分页查询的最佳方法是什么 也许我添加该列ROW NUMBER OVER ORDER BY Id AS RowNum 但这只会阻止简单查询的数据访问 在某些情况下 我使用选择
  • DataTable:通过 LINQ 或 LAMBDA 进行动态 Group By 表达式

    我有一个数据表 我想在其中对未指定数量的字段进行分组 发生这种情况的原因是用户可以选择他想要分组的字段 所以 实际上 我将选择推入列表中 在这个选择上 我必须对我的数据表进行分组 想象一下这段代码 VB 或 C 都一样 public voi
  • ASP.NET JQuery AJAX POST 返回数据,但在 401 响应内

    我的应用程序中有一个网页 需要调用我设置的 Web 服务来返回对象列表 这个调用是这样设置的 document ready function var response ajax type POST contentType applicati
  • 使用 HTMLAgilityPack 从节点的子节点中选择所有

    我有以下代码用于获取 html 页面 将网址设置为绝对 然后将链接设置为 rel nofollow 并在新窗口 选项卡中打开 我的问题是关于将属性添加到 a s string url http www mysite com string s
  • Visual Studio 2017 完全支持 C99 吗?

    Visual Studio 的最新版本改进了对 C99 的支持 最新版本VS2017现在支持所有C99吗 如果没有 C99 还缺少哪些功能 No https learn microsoft com en us cpp visual cpp
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代
  • 在 Xamarin 中获取 OutOfMemoryException

    java lang OutOfMemoryError 考虑增加 JavaMaximumHeapSize Java 执行时内存不足 java exe 我的 Visualstudio Xamarin 项目出现内存不足异常 请帮助我如何解决此问题

随机推荐

  • java: 二元运算符 ‘<‘ 的操作数类型错误 第一个类型: java.lang.Object 第二个类型: java.lang.Object

    在对对象进行大小比较时 运行就会出现下面报错 原因不能使用 gt 运算符对两个Object对象进行比较 gt 运算符只能直接用于原始整数类型 解决方法 1 将Object进行转换 转换成比如转换成Character类 String类 Int
  • 二分答案总结&例题解析

    对于二分我们最初的了解 就是在一个一次函数中 对于要求的点 x y 已知y 对于包含x值的区间二分 根据函数值与y比较 逐步靠近要求的点 直到最终求出要求的点 在程序执行时 二分的时间复杂度为logn 可以极大的减少查找的时间 二分的应用
  • Fiddler的安装和使用教程(详细)

    一 安装 1 fiddler工具下载网址 http www telerik com download fiddler 2 运行 FiddlerSetup exe一键完成安装 3 安装成功后点击关闭按钮 所选路径下多出一个Fiddler文件夹
  • 朋友问我,程序员和非程序员的思维模式有什么区别?

    英文 https javascript plainenglish io what is the difference in thinking model between programmers and normal persons 8ff8
  • dokcer命令一览

    Docker服务状态 安装参考 https yutian blog csdn net article details 119705377 1 为什么要使用Docker Docker是开发运维一体化的核心工具 提高开发 测试 运维的生命周期的
  • Linux下安装tomcat

    1 上传tomcat到root目录 通过ftp软件将tomcat上传到root目录下 在 usr local 创建一个tomcat目录 复制tomcat到 tomcat目录下 解压 tar 运行命令 tar xvf apachexxx 2
  • 如何在Oracle VM VirtualBox上安装ubuntu

    虚拟机链接 Virtual Box Downloads Oracle VM VirtualBox Ubuntu Ubuntu系统下载 Ubuntu 点开链接后进入首页如图 点击桌面系统进入 点击下载 下载完成后不用解压 打开Oracle V
  • 数学建模:18 粒子群算法

    目录 基础的粒子群算法 流程图 核心公式 改进惯性权重 线性递减的惯性权重 非线性递减的惯性权重 自适应的惯性权重 随机的惯性权重 改进学习因子 压缩学习因子 非对称学习因子 改进 自动退出迭代 测试函数 Matlab 自带的粒子群函数 p
  • 一种把四个字节(BYTE)组成一个32位int型的方法

    实现代码如下 int ConvertTo32 int la int lb int lc int ld la 0XFFFFFF la lt lt 24 lb 0XFF00FFFF lb lt lt 16 lc 0XFFFF00FF lc lt
  • linux扩展/dev/sda1分区方法

    一 准备 扩展虚拟机的磁盘空间 在虚拟机关闭状态下 点击虚拟机 gt 设置 gt 硬盘 gt 扩展 扩展自己需要的容量 二 开始扩展 idriver ubuntu su 1 切换至root用户 root ubuntu home idrive
  • Kettle教程(一):ETL简介、Kettle安装部署

    文章目录 前言 一 ETL 1 ETL是啥 2 ETL有啥价值 二 Kettle 1 简介 2 安装 三 总结 前言 随着大数据的不断发展 企业级别的数据转换显得尤为重要 从本文开始和大家一起学习一款开源ETL工具 Kettle 一 ETL
  • Android手写占位式插件化框架之Activity通信、Service通信和BroadcastReceiver通信

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 前言 1 什么是插件化 能运行的宿主APP去加载没有下载的APK文件 并使用APK文件里面的功能 这就叫插
  • Trace Function Enter, Exit and Leave

    http developer nokia com community wiki Trace Function Enter Exit and Leave
  • equals()方法的重写

    equals 本身是一个方法 并不是运算符 而且仅适用于引用数据类型 在java的引用数据时使用时 比较的并不是具体的数值 而是地址值 此时并不能有效地比较引用数据类型中的具体数据 比较地址值对于引用数据类型而言没有用 就出现了equals
  • 数组添加元素的方法-6种

    数组添加元素的方法 6种 使用 length 属性追加元素 使用length属性 可以在数组末尾后面添加一个元素 var arr 1 2 3 4 5 arr length 6 console log arr 1 2 3 4 5 6 使用 p
  • 远程控制 ToDesk

    ToDesk 远程控制软件 支持跨平台的远程控制 有且不限于PC对PC iOS Android也可以直接控制 最近发现的一个好用的远程连接软件 也是近些年非常火热的 远程控制软件 ToDesk 虽然 QQ 和 向日葵 也都可以满足我们实现的
  • 深入理解spring注解之@ComponentScan注解

    2018 05 20 10 02 23 今天主要从以下几个方面来介绍一下 ComponentScan注解 ComponentScan注解是什么 ComponentScan注解的详细使用 1 ComponentScan注解是什么 其实很简单
  • nginx配置同时支持https/wss协议(http/https ws/wss)都可以

    在Nginx代理集群支持SSL 整体架构如下 SSL SSL Secure Socket Layer 安全套接层 简单来说是一种加密技术 通过它 我们可以在通信的双方上建立一个安全的通信链路 因此数据交互的双方可以安全地通信 而不需要担心数
  • iis6.0配置与漏洞复现

    实验环境 windows sesrver 2003 asp环境 1 iss服务器的搭建 1 点击开始 gt 控制面板 gt 添加或删除程序 2 点击添加或删除程序 3 点击应用程序服务器 gt 点击详细信息 点击确定完成配置 4 点击开始
  • 模板的完全特例化和部分特例化

    介绍 完全特例化就是类型完全明确的版本 而部分特例化指的是 只知道是几个参数的函数而不知道参数的类型 或者是只知道是引用或者是指针类型 而不知道具体是char 还是 int 模板特例化实例1 template