C++函数模板特化,类模板特化

2023-10-29

一、模版与特化的概念

1. 函数模版与类模版

C++中模板分为函数模板和类模板

  • 函数模板:是一种抽象函数定义,它代表一类同构函数。
  • 类模板:是一种更高层次的抽象的类定义。

2. 特化的概念

所谓特化,就是将泛型的东西搞得具体化一些,从字面上来解释,就是为已有的模板参数进行一些使其特殊化的指定,使得以前不受任何约束的模板参数,或受到特定的修饰(例如const或者摇身一变成为了指针之类的东东,甚至是经过别的模板类包装之后的模板类型)或完全被指定了下来。

二、 模板特化的分类

针对特化的对象不同,分为两类:函数模板的特化和类模板的特化

1. 函数模板的特化

当函数模板需要对某些类型进行特化处理,称为函数模板的特化。

2. 类模板的特化

当类模板内需要对某些类型进行特别处理时,使用类模板的特化。

3. 特化整体上分为全特化和偏特化

(1)全特化

就是模板中模板参数全被指定为确定的类型。

全特化也就是定义了一个全新的类型,全特化的类中的函数可以与模板类不一样。

(2)偏特化

就是模板中的模板参数没有被全部确定,需要编译器在编译时进行确定。

全特化的标志就是产生出完全确定的东西,而不是还需要在编译期间去搜寻适合的特化实现,貌似在我的这种理解下,全特化的 东西不论是类还是函数都有这样的特点

(3)两者的差别

模板函数只能全特化,没有偏特化(以后可能有)

模板类是可以全特化和偏特化的。

全特化的标志:template <>然后是完全和模板类型没有一点关系的类实现或者函数定义
偏特化的标志:template

函数模版特化:目前的标准中,模板函数只能全特化,没有偏特化

至于为什么函数不能偏特化,似乎不是因为语言实现不了,而是因为偏特化的功能可以通过函数的重载完成。

三、示例代码

1. 函数模板的特化

#include <iostream>
#include <cstring>

//	函数模板
template <class T>
int compare(const T left, const T right)
{
    std::cout <<"in template<class T>..." <<std::endl;
    return (left - right);
}


//  一个特化的函数模版
template < >
int compare<const char*>(const char* left, const char* right)
{
    std::cout <<"in special template< >..." <<std::endl;

    return strcmp(left, right);
}

//  这个其实本质是函数重载
int compare(char* left, char* right)
{
    std::cout <<"in overload function..." <<std::endl;
    return strcmp(left, right);
}

int main( )
{
    compare(1, 4);

    const char *left = "abcdef";
    const char *right = "wild_wolf";
    compare(left, right);

    return 0;
}

2. 类模板的特化:与函数模板类似,当类模板内需要对某些类型进行特别处理时,使用类模板的特化。

#include <iostream>
#include <cstring>
#include <cmath>
#include"tt.h"
// general version
template<class T>
class Compare
{
public:
    static bool IsEqual(const T& lh, const T& rh)
    {
        std::cout << "in the general class..." << std::endl;
        return lh == rh;
    }
};

// specialize for float
template<>
class Compare<float>
{
public:
    static bool IsEqual(const float& lh, const float& rh)
    {
        std::cout << "in the float special class..." << std::endl;

        return std::abs(lh - rh) < 10e-3;
    }
};

// specialize for double
template<>
class Compare<double>
{
public:
    static bool IsEqual(const double& lh, const double& rh)
    {
        std::cout << "in the double special class..." << std::endl;

        return std::abs(lh - rh) < 10e-6;
    }
};

int main(void)
{
    Compare<int> comp1;
    std::cout << comp1.IsEqual(3, 4) << std::endl;
    std::cout << comp1.IsEqual(3, 3) << std::endl;

    Compare<float> comp2;
    std::cout << comp2.IsEqual(3.14, 4.14) << std::endl;
    std::cout << comp2.IsEqual(3, 3) << std::endl;

    Compare<double> comp3;
    std::cout << comp3.IsEqual(3.14159, 4.14159) << std::endl;
    std::cout << comp3.IsEqual(3.14159, 3.14159) << std::endl;

    std::cout << hh<string>()("11") << std::endl;
    system("pause");
    return 0;
}

其中tt.h如下:

#include<string>
using std::string;

template<typename key>
class hh
{
public:
	size_t operator()(const key& k) const {
		size_t hashVal = 0;

		key tmp = k;
		while (tmp > 0) {
			hashVal = 37 * hashVal + tmp % 10;
			tmp /= 10;
		}
		return hashVal;
	}
};

template<>
class hh<string>
{
public:
	 size_t operator()(const string& key) {
		size_t hashVal = 0;
		std::cout << key << std::endl;
		for (char ch : key) {
			std::cout << "hasVal: " << hashVal << std::endl;
			hashVal = 37 * hashVal + ch;
		}

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

C++函数模板特化,类模板特化 的相关文章

  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile

随机推荐

  • Altium Designer 消除Net has no driving source警告的方法

    在进行原理图编译的时候提示警告 Net has no driving source 如下图 解决方法 点击Place Directives No ERC 不进行电气规则检查 在有警告的相应引脚处放置一个No ERC即可 然后从新编译就没有警
  • 第三方支付由直连模式进入网联模式

    不知不觉 中国已成为使用手机支付最多的国家 手机支付的两大的厂商 支付宝和微信支付 已经走进了千家万户 现在出门基本上手机能解决的基本上不用现金 人们已经习惯了不带现金的日子了 支付宝 在去年 支付宝与微信先后发布了提现需要收取0 1 的手
  • 研究阶段性总结

    写这一篇只是对自己之前做的东西做个简短的总结以及为接下来的发展做个规划 自己目前的研究领域为基于深度学习的自然语言处理 研一上学期主要是学习了自然语言处理的基础以及python语言 包括分词 词性标注 构建词典 基本算法原理python实现
  • unity3d 给模型添加刚体后、或者角色控制器后下坠

    1 给模型添加一个刚体后 还要给模型添加一个碰撞器 人和地面的话 要注意地面有没有碰撞器 有的话注意地面碰撞器的Mesh网格是不是Null 还有
  • javaScript和jQuery自动加载方法

    一 JavaScript自动加载 在文本中用onload 当页面中所有内容 包括图片 加载完后再执行onload 如下 在脚本中用window onload 当页面中的所有内容 包括图片 加载完后再执行window onload 如下 wi
  • frp服务器内网穿透设置

    内网穿透的作用 内网穿透是指在一个局域网内 也称内网 中 通过某种技术手段 将局域网内部的网络资源 如ssh服务 Web服务 数据库等 暴露到公网中 从而实现公网用户对内网资源的访问和控制 它可以使得外部用户能够访问局域网内部的设备和服务
  • ubuntu20.04安装Android Studio踩坑

    1 卸载搜狗输入法 截止现在 2020年10月7日 当搜狗输入法处于活动状态时 所有jetbrains全家桶都不能用 换用百度输入法解决问题 2 Failed to install the following Android SDK pac
  • C++之内联函数

    C 之内联函数 为什么要有内联函数 我们编写了一个小函数 它的功能是比较两个string形参的长度并返回长度较小的string的引用 挑出两个string 对象中较短的那个 返回其引用 const string shorterString
  • STM32 基于keil5的printf打印设置

    1 因为使用串口来打印 所以将fputc函数和fgetc函数放在usart c源文件中 2 在usart c源文件中添加stdio h头文件 3 打印信息常用于调试 不建议使用中断 4 在usart c源文件中添加如下代码 int fput
  • 多通道振弦数据记录仪应用桥梁安全监测的解决方案

    多通道振弦数据记录仪应用桥梁安全监测的解决方案 城市化进程的加快和交通运输的发展 桥梁作为连接城市的重要交通工具 其安全性也变得越来越重要 为了保证桥梁的安全性 需要进行定期的监测和维护 其中 多通道振弦数据记录仪是一种有效的监测手段 可以
  • 零基础在家学编程,挑战年薪10万~100万

    疫情常态化 居家常态化 房贷 车贷 生活开支常态化 如何让我们的收入也常态化 有人说 我们眼下所处的二十一世纪二十年代是世界大转折之年代 而作为一位社会普通人员 如何才能跟上社会发展 如何提高自己生存能力 如何适应社会发展状态 如何保障稳定
  • 本地电脑无法登陆路由器

    以TPLINK 路由器为例 路由器有两种登录方式 1 输入如下所示字符串 http tplogin cn 适用于本地电脑ip地址是自动获得IP的情况 如果是勾选 使用下面的IP地址 则无法登陆路由器 2 输入固定IP方式 不同品牌路由器地址
  • 异常:Could not set parameters for mapping: ParameterMapping{property='xxx', mode=XX, ······}

    1 在前端页面做添加货物的数据时 将前端的数据返回到Controller的方法 执行下一步就出现以下的异常 java lang RuntimeException org mybatis spring MyBatisSystemExcepti
  • 机器学习之聚类

    无监督学习 Learning from unlabeled unannotated data without supervision 聚类概念 the process of grouping a set of objects into cl
  • h3c 交换机 密文 有解密办法吗?

    用户名123 密码123 可逆 local user 123 password cipher c 3 3 3kK6PWyha6eFuCtZ0QfnE1jVsmBOaiw 用户名123 密码123 可逆 local user 123 pass
  • 服务器物理链路,【交换机在江湖对接案例】配置堆叠系统对接NLB服务器群集示例(通过物理链路环回方法)...

    配置堆叠系统对接NLB服务器群集示例 通过物理链路环回方法 设备通过物理链路环回方法对接NLB服务器群集简介 NLB是微软在Windows Server上开发的多服务器群集负载均衡特性 交换机与NLB服务器群集相连时 NLB服务器要求交换机
  • 浅谈web前端工程师hr面试经典问题20+

    目录 前言 一 经典灵魂20问 1 你为什么不考研 2 你如何看待加班 3 为什么选择北京 4 最能概况你自己的三个词 5 你喜爱的运动 6 你的座右铭 7 谈谈你的缺点 8 对于这项工作你有那些可预见性的困难 9 如果我录用你 你将怎样开
  • 永洪科技上榜2023年度 IDC中国FinTech 50

    8月15日 全球知名的第三方研究机构IDC发布了 2023 IDC中国FinTech 50 榜单 永洪科技凭借完善的产品服务体系 差异化的产品优势以及丰富的客户实践经验 已经连续两年荣登 IDC 中国 FinTech 50 榜单 IDC作为
  • Keras Conv1d 参数及输入输出详解

    Conv1d in channels out channels kernel size stride 1 padding 0 dilation 1 groups 1 bias True filters 卷积核的数目 即输出的维度 kerne
  • C++函数模板特化,类模板特化

    一 模版与特化的概念 1 函数模版与类模版 C 中模板分为函数模板和类模板 函数模板 是一种抽象函数定义 它代表一类同构函数 类模板 是一种更高层次的抽象的类定义 2 特化的概念 所谓特化 就是将泛型的东西搞得具体化一些 从字面上来解释 就