C++模板编程中只特化模板类的一个成员函数(花样特化一个成员函数)
转自:https://www.cnblogs.com/zhoug2020/p/6581477.html
模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数。类模板中大多数成员函数的功能可能是一模一样的,特化时我们可能只需要重新实现1、2个成员函数即可。在这种情况下,如果全部重写该模板类的所有成员函数,不但会增加工作量,也不利于代码的维护。
例如下面的类模板A,只有在模板参数是char*时才需要特化成员函数func(),但其他的成员函数都不需要特化:
1 template <typename _Ty>
2 struct A
3 {
4 // 其他成员函数a
5 // 其他成员函数b
6 // ......
7 void func()
8 {
9 std::cout << "common type." << std::endl;
10 }
11 };
12
13 int main()
14 {
15 A<int> i;
16 i.func();
17
18 A<char*> c;
19 c.func();
20
21 return 0;
22 }
方法一:通过运行时类型识别,这个方法最简单
1 template <typename _Ty>
2 struct A
3 {
4 // 其他成员函数a
5 // 其他成员函数b
6 // ......
7 void func()
8 {
9 if (typeid(_Ty) == typeid(char*))
10 std::cout << "common type." << std::endl;
11 else
12 std::cout << "special type." << std::endl;
13 }
14 };
方法二:通过类的成员函数模板特化来实现,这个方法也比较简单
1 template <typename _Ty>
2 struct A
3 {
4 // 其他成员函数a
5 // 其他成员函数b
6 // ......
7 template <typename __Ty>
8 void funcImpl()
9 {
10 std::cout << "common type." << std::endl;
11 }
12
13 template <>
14 void funcImpl<char*>()
15 {
16 std::cout << "special type." << std::endl;
17 }
18
19 void func()
20 {
21 funcImpl<_Ty>();
22 }
23 };
方法三:通过一个嵌套模板类的特化来实现
1 template <typename _Ty>
2 struct A
3 {
4 // 其他成员函数a
5 // 其他成员函数b
6 // ......
7 template <typename __Ty>
8 struct IsCharPType
9 {
10 const static bool b = false;
11 };
12
13 template<>
14 struct IsCharPType<char*>
15 {
16 const static bool b = true;
17 };
18
19 void func()
20 {
21 if (IsCharPType<_Ty>::b)
22 std::cout << "special type." << std::endl;
23 else
24 std::cout << "common type." << std::endl;
25 }
26 };
方法四:先定义一个嵌套的类模板,通过重载函数实现(函数的参数类型不同
1 template <typename _Ty>
2 struct A
3 {
4 // 其他成员函数a
5 // 其他成员函数b
6 // ......
7 template <typename __Ty>
8 struct TypeClass
9 {
10 };
11
12 template <typename __Ty>
13 void funcImpl(const TypeClass<__Ty>&)
14 {
15 std::cout << "common type." << std::endl;
16 }
17
18 void funcImpl(const TypeClass<char*>&)
19 {
20 std::cout << "special type." << std::endl;
21 }
22
23 void func()
24 {
25 funcImpl(TypeClass<_Ty>());
26 }
27 };
C++模板编程中只特化模板类的一个成员函数(花样特化一个成员函数)的更多相关文章
- C++模板编程中只特化模板类的一个成员函数
模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数.类模板中大多数成员函数的功能可能是一模一样的,特化时我们可能只需要重新实现1.2个成员函数即可.在这种情况下,如果全 ...
- C++ 11可变参数接口设计在模板编程中应用的一点点总结
概述 本人对模板编程的应用并非很深,若要用一句话总结我个人对模板编程的理解,我想说的是:模板编程是对类定义的弱化. 如何理解“类定义的弱化”? 一个完整的类有如下几部分组成: 类的名称: 类的成员变量 ...
- 《深入实践C++模板编程》之一——Hello模板
1.通过一个简单的例子来理解模板的用途: 模板为不同类型的数据生成操作相同或相似的函数. 弱语言如Python,可以使用一种函数来应对各种类型,但是C++就不得不为不同的类型编写相似的函数.模板的作用 ...
- java编程中的断言工具类(org.springframework.util.Assert)
转自:https://blog.csdn.net/gokeiryou263/article/details/19612471 断言工具类:Assert类, java.lang.Object ---&g ...
- 《深入实践C++模板编程》之二——模板类
1.类的模板的使用 类,由于没有参数,所以没有模板实参推导机制. #include <stdexcept> template<typename T> class my_stac ...
- Thymeleaf常用语法:模板文件中表达式调用Java类的静态方法
在模板文件的表达式中,可以使用“${T(全限定类名).方法名(参数)}”这种格式来调用Java类的静态方法. 开发环境:IntelliJ IDEA 2019.2.2Spring Boot版本:2.1. ...
- opencv 单目标模板匹配(只适用于模板与目标尺度相同)
#include <iostream> #include "opencv/cv.h" #include "opencv/cxcore.h" #inc ...
- MShadow中的表达式模板
表达式模板是Eigen.GSL和boost.uBLAS等高性能C++矩阵库的核心技术.本文基于MXNet给出的教程文档来阐述MXNet所依赖的高性能矩阵库MShadow背后的原理. 编写高效的机器学习 ...
- MVC中子页面如何引用模板页中的jquery脚本
MVC中子页面如何引用模板页中的jquery脚本 最近在学习mvc,遇到了一个问题:在html页面中写js代码,都是引用mvc5自带的jquery脚本,虽然一拖(将指定的jquery脚本如 jquer ...
随机推荐
- Python 网络爬虫的常用库汇总
爬虫的编程语言有不少,但 Python 绝对是其中的主流之一.下面就为大家介绍下 Python 在编写网络爬虫常常用到的一些库. 请求库:实现 HTTP 请求操作 urllib:一系列用于操作URL的 ...
- gitlab(7.9)升级到8.0.1
1.gitlab8.0更新说明 GitLab 8.0 现在完全集成了持续集成工具 (GitLab CI) ,此外还完全重写了 UI,节省了至少 50% 的磁盘空间.更快的合并,内置持续集成(CI)到 ...
- 【2019牛客多校第一场】XOR
题意: 给你一个集合A,里边有n个正整数,对于所有A的.满足集合内元素异或和为0的子集S,问你∑|S| n<=1e5,元素<=1e18 首先可以转化问题,不求∑|S|,而是求每个元素属于子 ...
- 《BUG创造队》作业8:软件测试与Alpha冲刺(第一天)
项目 内容 这个作业属于哪个课程 2016级软件工程 这个作业的要求在哪里 实验十二 团队作业8:软件测试与ALPHA冲刺 团队名称 BUG创造队 作业学习目标 (1)掌握软件测试基础技术.(2)学习 ...
- 容错(Fault-tolerance)
Spark Streaming的容错包括了三个地方的容错: 1.Executor失败容错:Executor的失败会重新启动一个新的Executor,这个是Spark自身的特性.如果Receiver所在 ...
- 简述 OSI 七层协议?
OSI七层协议是一个用于计算机或通信系统间互联的标准体系. 物理层功能:主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0. 数据链路层的功能:定义了电信号的分组方式按照以太 ...
- Prometheus监控学习笔记
K8S最佳实战(包括了K8S的Prometheus监控和EFK日志搜集) https://jimmysong.io/kubernetes-handbook/practice/ Prometheus-b ...
- Acwing P274 移动服务 题解
每日一题 day21 打卡 Analysis DP的状态为已经完成的请求数量,通过指派一位服务员可以把”完成i - 1个请求的状态”转移到”完成i个请求的状态”那么我们可以知道转移从dp[i - 1] ...
- easyui增删改查
easyui的crud(dialog,datagrid.form讲解)1.datagrid布局2.dialog布局3.form布局4.通用的JsonBaseDao增删改方法5.dao层6.web层7. ...
- PHP CURL 错误码说明
curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader'));//一般不加 <?php return [ '1'=> ...