《深入实践C++模板编程》之四——特例
- template<typename T, int i> struct S1;
- template<typename T, int i, template<typename, int> class SP>
- struct S;//这里先定义一个模板通例
- template<int i, template<typename, int> class SP>
- struct S<char, i, SP>;//省略了typename T
- template<typename T, int i, template<typename, int> class SP>
- struct S<const T, i, SP>;//约束第一个模板参数的类型必须用const修饰
- template<>
- struct S<char, , S1>;//完全特例,其匹配式中没有用到任何模板参数,所有项目都是确定的类型或值或模板。故其模板参数列表为空。相应的,我们将模板参数列表不为空的特例成为部分特例
- template<typename T>
- struct S<S1<T, >, , S1>;//难点理解:同特例2一样,这里也是对T的一种约束,它要求S这个模板的第一个参数必须是S1<T, 10>模板的实例,而第三个参数要是S1型的某个模板,这里不要搞混(搞混的话就回头去看模板型模板参数)
- template<typename T0, typename T1, typename T2>
- struct S
- {
- std::string id()
- {
- return "General";
- }
- };
- template<typename T0, typename T1>
- struct S<T0, T1, char>
- {
- std::string id()
- {
- return "Specialization #1";
- }
- };
- template<typename T0>
- struct S<T0, char, char>
- {
- std::string id()
- {
- return "Specialization #2";
- }
- };
- template<typename T>
- struct S<int, T, T>
- {
- std::string id()
- {
- return "Specialization #3";
- }
- };
- void main()
- {
- using namespace std;
- printf("%s\n", S<float, float, float>().id().c_str());//匹配通例
- printf("%s\n", S<int, int, int>().id().c_str());//只与特例3匹配
- printf("%s\n", S<int, int, char>().id().c_str());//与特例1匹配,因为特例3要求后两个类型是相同的
- printf("%s\n", S<char, char, char>().id().c_str());//与特例1和特例2均匹配,但特例2比特例1更加特殊
- printf("%s\n", S<int, char, char>().id().c_str());//在特例2和特例3之间无法判断谁更特殊
- getchar();
- }
- template<typename T>
- void func(T v)
- {
- printf("#1\n");
- }
- template<>
- void func(float v)
- {
- printf("#2\n");
- }
- void func(float v)
- {
- printf("#3\n");
- }
- void main()
- {
- func();//只有#1才有可能是int,其它全是float
- func(.);//1.是double类型,只有#1才有可能是double,其它全是float
- func(.f);//#1和#2和#3都与实参类型完全匹配。#2比#1更加特殊,淘汰掉#1。#3与#2之间比较选择非模板函数#3。
- func<>(.f);//这里显式指定要使用的是一个模板实例
- getchar();
- }
- template<int i>
- void print()
- {
- print<i - >();
- printf("%d\n", i);
- }
- template<>
- void print<>()
- {
- printf("1!\n");
- }
- void main()
- {
- print<>();
- getchar();
- }
《深入实践C++模板编程》之四——特例的更多相关文章
- 《深入实践C++模板编程》之五——容器与迭代器
1.容器的定义 容器:专门用于某种形式组织及存储数据的类称为“容器”. 2.容器与迭代器 迭代器:封装了对容器虚拟数据序列的操作并按约定提供统一界面以遍历容器内容的代理类即为迭代器. 举例理解 ...
- 《深入实践C++模板编程》之六——标准库中的容器
1.容器的基本要求 a.并非所有的数据都可以放进容器当中.各种容器模板对所存数据类型都有一个基本要求——可复制构造.将数据放进容器的过程就是通过数据的复制构造函数在容器内创建数据的一个副本的过程. b ...
- 《深入实践C++模板编程》之三——模板参数类型详解
非类型模板参数 和 模板型模板参数 整数以及枚举类型:指向对象或者函数的指针:对对象或函数的引用:指向对象成员的指针.统称为非类型模板参数. 模板型模板参数,是指模板参数还可以是一个模板. 1.整 ...
- 《深入实践C++模板编程》之二——模板类
1.类的模板的使用 类,由于没有参数,所以没有模板实参推导机制. #include <stdexcept> template<typename T> class my_stac ...
- 《深入实践C++模板编程》之一——Hello模板
1.通过一个简单的例子来理解模板的用途: 模板为不同类型的数据生成操作相同或相似的函数. 弱语言如Python,可以使用一种函数来应对各种类型,但是C++就不得不为不同的类型编写相似的函数.模板的作用 ...
- C++之模板编程
当我们越来越多的使用C++的特性, 将越来越多的问题和事物抽象成对象时, 我们不难发现:很多对象都具有共性. 比如 数值可以增加.减少:字符串也可以增加减少. 它们的动作是相似的, 只是对象的类型不同 ...
- 深入C++04:模板编程
模板编程 函数模板 模板意义:对类型也进行参数化: 函数模板:是不编译的,因为类型不知道 模板的实例化:函数调用点进行实例化,生成模板函数 模板函数:这才是要被编译器所编译的 函数模板.模板的特例化. ...
- c++模板编程-typename与class关键字的区别
最近一直在研究c++模板编程,虽然有些困难,但希望能够坚持下去.今天,在书上看见一个讨论模板编程typename与class两个关键字的区别,觉得挺有意义的,就把它们给总结一下. 先看一个例子: te ...
- [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)
原文:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 继上两篇:ORACLE PL ...
随机推荐
- 20175329&20175313&20175318 2019-2020 《信息安全系统设计基础》实验一
详见 https://www.cnblogs.com/xiannvyeye/p/11792152.html#%E4%B8%80%E5%AE%9E%E9%AA%8C%E5%86%85%E5%AE%B9
- A*算法解决15数码问题_Python实现
1问题描述 数码问题常被用来演示如何在状态空间中生成动作序列.一个典型的例子是15数码问题,它是由放在一个4×4的16宫格棋盘中的15个数码(1-15)构成,棋盘中的一个单元是空的,它的邻接单元中的数 ...
- kotlin class
每个次构造函数需要委托给主构造函数, 可以直接委托或者通过别的次构造函数间接委托.委托到同一个类的另一个构造函数用 this 关键字即可 class Person { constructor(pare ...
- python3.6 列表推导式学习
a=[i for i in range(1,10) if i%2==0]print(a)c=[(x,y) for x in range(5) if x%2==0 for y in range(5) i ...
- Message NNNN not found; No message file for product=network, facility=TNS
Message NNNN not found; No message file for product=network, facility=TNS Table of Contents 1. 错误信息 ...
- python MySQLdb连接mysql时报错
故障现象: >>> import MySQLdb >>> conn = MySQLdb.connect(host=,charset="utf8" ...
- AcitveReocrd事件和关联操作
ActiveRecord预定义的事件,都在 yiidbBaseActiveRecord 中进行了明确: abstract class BaseActiveRecord extends Model ...
- Redis4.0.11在linux上面安装时候编译的输出
root@iZ2zedo02x7n4nuc3lb4ueZ:/opt/redis-4.0.11/src# make install CC Makefile.deprm -rf redis-server ...
- SpringSecurity快速入门
作者:SingleXu 链接:https://www.jianshu.com/p/8212a559d633 来源:简书 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 简介 Sp ...
- Docker Swarm常用命令
#查看集群节点 docker node ls #创建nginx服务 #docker pull hub.test.com:5000/almi/nginx:0.1 #下载私有仓库镜像 docker ser ...