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 ...
随机推荐
- 关于类型为numpy,TensorFlow.tensor,torch.tensor的shape变化以及相互转化
https://blog.csdn.net/zz2230633069/article/details/82669546 2018年09月12日 22:56:50 一只tobey 阅读数:727 1 ...
- 利用Minhash和LSH寻找相似的集合
from: https://www.cnblogs.com/bourneli/archive/2013/04/04/2999767.html 问题背景 给出N个集合,找到相似的集合对,如何实现呢?直观 ...
- Murach ASP.NET 4.5 C# With Visual Studio 2013 翻译
本书由我自己翻译完,省略书中练习部分,练习部分可以阅读原文 本书对新手友好,介绍了Web通讯的基本原理,ASP.NET开发,项目开发所需的各种开发与部署技术, Ajax,与WCF, Web API ...
- 【转】win10硬盘序列号查看方法
原文:https://zixue.3d66.com/changjianwenti/tiwen_9679.html ------------------------------------------- ...
- 织梦CMS5.7主动推送二次开发
今天一个朋友叫我写个织梦的百度主动推送插件,实现的功能是:每发表或者更新一篇文章,都会触动主动推送,达到资源最新提交给百度进行抓取. 案例站点:奇迹私服 第一步:登入FTP,在/后台的文件夹/arti ...
- LeetCode 381. Insert Delete GetRandom O(1) - Duplicates allowed
原题链接在这里:https://leetcode.com/problems/insert-delete-getrandom-o1-duplicates-allowed/?tab=Description ...
- 初始SpringBoot
导入依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:/ ...
- regedit系统注册表,msconfig系统配置
msconfig msconfig即系统配置实用程序,是Microsoft System Configuration的缩写.是在开始菜单里运行中输入然后确认就可以找到程序开启或者禁用, 可以帮助电脑禁 ...
- undefined null 与 字符串相加
在进行一个字符串的判断的时候. 如下一段内容 const queryObj = {}; const str = queryObj.criteriaStr + "" con ...
- Maven项目启动失败:class path resource [spring/] cannot be resolved to URL because it does not exist
目录 Maven项目启动失败:class path resource [spring/] cannot be resolved to URL because it does not exist 解决方 ...