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 ...
随机推荐
- Android自动化测试探索(七)代码覆盖率统计
之前在 https://www.cnblogs.com/zhouxihi/p/11453738.html 这篇写了一种统计Android覆盖率的方式 但是对于一些比较复杂或者代码结构不够规范的项目,有 ...
- Flask统计代码行数
流程: 1.获取前端的文件 2.判断文件是否zip文件 3.解压压缩包并保存 4.遍历解压后的文件夹 5.判断文件是否py文件,将绝对路径添加到列表 6.循环列表,排除注释和空号,统计行数 from ...
- mount.cifs Windows共享目录权限755问题
umount -l /usr/local/tomcat7/webapps/dsideal_yy/html/down mount -t cifs -o rw,dir_mode=,file_mode=,s ...
- 《你说对就队》第九次团队作业:【Beta】Scrum meeting 3
<你说对就队>第九次团队作业:[Beta]Scrum meeting 3 项目 内容 这个作业属于哪个课程 [教师博客主页链接] 这个作业的要求在哪里 [作业链接地址] 团队名称 < ...
- 采集新浪新闻php插件
今天没事,就分享一个采集新浪新闻PHP插件接口,可用于火车头采集,比较简单,大家可以研究! 新浪新闻实时动态列表为:https://news.sina.com.cn/roll/?qq-pf-to=pc ...
- Django --- cookie与session,中间件
目录 1.cookie与session 1.cookie 2.session 2.中间件 1.中间件作用 2.用户可以自定义的五个方法 3.自定义中间件 1.cookie与session 1.cook ...
- JQuery购物车多物品数量的加减+总价计算
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- sublime+python3 中文环境
工具-编译系统-新编译系统 { "cmd": ["C:/Program Files (x86)/Python36-32/python.exe","-u ...
- NetworkX系列教程(11)-graph和其他数据格式转换
小书匠 Graph 图论 学过线性代数的都了解矩阵,在矩阵上的文章可做的很多,什么特征矩阵,单位矩阵等.grpah存储可以使用矩阵,比如graph的邻接矩阵,权重矩阵等,这节主要是在等到graph后 ...
- Ubuntu16.4 内核降级
.cp /etc/apt/sources.list /etc/apt/sources.list.bak #备份sources.list .vi /etc/apt/sources.list #在sour ...