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++函数模板特化,类模板特化 的相关文章

  • Qt 图表和数据可视化小部件

    我已经安装了 Qt 5 7 来尝试 Qt 图表和 Qt 数据可视化 但我在 Qt Designer 和 Qt Creator 中都找不到新的小部件 有什么建议我应该做什么才能让新的小部件出现在设计器中 我今天遇到了完全相同的问题 默认情况下
  • X11 模式对话框

    如何使用 Xlib 在 X11 中创建模式对话框 模态对话框是一个位于应用程序其他窗口之上的窗口 就像瞬态窗口一样 并且拒绝将焦点给予应用程序的其他窗口 在 Windows 中 当试图从模态窗口夺取焦点时 模态也会通过闪 烁模态窗口的标题栏
  • .NET 单点登录

    我一直在尝试使用 C 为 NET Web 应用程序实现 WEB SSO 服务提供程序插件 我将使用 shibboleth 身份提供商 我已经使用 OpenSAML 库为 java 应用程序实现了相同的功能 我想知道在 NET 应用程序中使用
  • fopen_s 怎么会比 fopen 更安全呢?

    我正在处理遗留代码Windows平台 当我编译代码时VS2013 它给出以下警告 错误 C4996 fopen 该函数或变量可能不安全 考虑使用fopen s反而 要禁用弃用 请使用 CRT SECURE NO WARNINGS 详情请参见
  • 为什么我会收到未找到分析器的警告?

    我创建了一个玩具项目来检查最新的 NET 7 预览版 5 和正则表达式代码生成 它效果很好 所以我对现有项目应用了相同的更改 不是为了生产 而是为了个人生产力 由于某种原因 我收到这些警告 CS8032 An instance of ana
  • ASP.NET Web 应用程序中的身份验证遇到问题

    我正在尝试对从登录页面登录我的 Web 应用程序的用户进行身份验证 我正在使用本教程 http support microsoft com kb 301240作为指南 它几乎准确地解释了我希望做什么 但是当我输入用户名和密码时 验证不起作用
  • NDK 应用 onDestroy 清理 - 如何 DetachCurrentThread

    因此 如果我们连接 我们必须在完成后分离线程 对吗 JNIEnv get jni env JNIEnv res JAVA VM gt GetEnv void res JNI VERSION 1 6 Using cached JavaVM J
  • 如何在C中同时运行两个子进程?

    所以我开始学习并发编程 但由于某种原因我什至无法掌握基础知识 我有一个名为 fork c 的文件 其中包含一个 main 方法 在此方法中 我将 main 分叉两次 分别进入子进程 1 和 2 在孩子 1 中 我打印了字符 A 50 次 在
  • ContentDialog 未与 UWP 中心对齐

    据我所知 ContentDialog的默认行为应该是使其在 PC 上居中并在移动设备上与顶部对齐 但就我而言 即使在 PC 上我也将其与顶部对齐 但我不明白发生了什么 我正在使用代码隐藏来创建它 这是我正在使用的代码片段 Creates t
  • 无法加载程序集问题

    我收到以下错误 无法加载程序集 错误详细信息 System BadImageFormatException 无法加载文件或程序集 文件 或其依赖项之一 该程序集是由比当前加载的运行时更新的运行时构建的 无法加载 该程序集是使用 Net Fr
  • 传递数组时在 C 中的函数参数中强制指定数组大小

    Context 在 C 中 我有一个以数组作为参数的函数 该参数用作该函数的输出 输出的大小始终相同 我会 让阅读代码的人清楚所需的大小 不过它已经在函数注释中了 理想情况下 编译会输出警告或错误 这样我就可以在编译时而不是运行时防止出现问
  • 如何检测应用程序正在运行的 .NET 版本?

    我尝试使用Environment Version ToString 确定目标计算机上正在使用什么 NET 框架 但安装了 4 0 版本时 它说我正在使用 NET 2 0 如何检测目标计算机上正在运行的 NET Framework 版本 En
  • 如何将System.Windows dll添加到Visual Studio 2010 Express?

    我正在开发一个小型应用程序C and VS2010 as IDE with NET框架4 我想用CaptureSource类以便从笔记本电脑的网络摄像头捕获视频 为此我需要添加一个命名空间System Windows DependencyO
  • “1个未解决的外部”C++

    我已经检查了所有文件之间的连接以及类和函数定义 但每次我尝试运行我的程序时 它都会阻止我并告诉我它有 1 个未解析的外部 该程序应该打开多个文件 一个 学生 文件和一个 成绩 文件 从中读取数据 然后使用 查询文件 来查找数据 找到查询中要
  • 从对列表创建邻接列表类型结构

    在 C 中 我有 class Pair int val1 int val2 我有一个来自以下来源的配对列表 List
  • Boost.asio和异步链,unique_ptr?

    我对异步编程不太熟悉 我有一个问题 我的问题如下 给出 boost asio 中 C 11 的 echo server 示例 http www boost org doc libs 1 60 0 doc html boost asio ex
  • 从脚本启用/禁用 GameObject 组件 [Unity3D]

    我需要获取一个脚本中设置的布尔值 放入名为 bouclier 的变量 以启用或禁用游戏对象 该变量位于游戏对象 Player 中 此处右下角 我需要启用或禁用这个游戏对象 Bouclier01 为此 我将脚本附加到游戏对象 Bouclier
  • 如何在c#中创建多线程

    我需要监听机器中的所有串行端口 假设我的机器有 4 个串行端口 我必须创建 4 个线程并开始分别使用附加线程监听每个端口 我使用此代码来获取我的机器中的端口数量 private SerialPort comPort new SerialPo
  • 在windows + opengl中选择图形设备

    我知道如何使用 openGL 打开窗口 使用 Win32 或其他工具包 但是当系统有2块显卡时 如何选择要渲染的图形设备 我的编程语言是 C 我专注于 Windows 但任何示例都将受到欢迎 编辑 也许更好地解释我的问题是个好主意 以便添加
  • 如何使用 C# 为 azure devops 变量赋值

    我有 selenium C 测试脚本 可以从浏览器获取令牌 我有两个 azure devops 任务 一个用于执行 selenium 测试 另一个用于执行 API 测试 我想将 selenium 测试获取的令牌传递给 API 测试执行任务

随机推荐

  • 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 特化的概念 所谓特化 就是将泛型的东西搞得具体化一些 从字面上来解释 就