《深入实践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 ...
随机推荐
- 修改网卡缓存,解决Linux 网卡丢包严重问题
Linux 网卡丢包严重 生产中有一台linux设备并发比较大,droped包比较多,尤其是在跑游戏数据包的时候,存在严重的丢包现象,怀疑网卡性能不足,在更换设备前想能不有通过软件方法解决,通过网上一 ...
- NProgress的使用 及 路由 token 定向的使用
主要配合路由生命周期使用 实现一个进度条的效果 使用方法: 1. 下载:npm install --save nprogress 使用:NProgress.start(); 开始 NProgress ...
- 提高组刷题营 DAY 2
1.滞空(jump/1s/64M) #include<bits/stdc++.h> using namespace std; typedef long long LL; ; inline ...
- 优化webpack打包速度方案
基本原理要么不进行打包:要么缓存文件,不进行打包:要么加快打包速度. 不进行打包方案: 1,能够用CDN处理的用CDN处理,比如项目引入的第三方依赖jquery.js,百度编辑器 先进行打包或者缓存然 ...
- Chrome console不输出内容
设置成info就好了
- 数据分析 - matpltlib 模块
matplotlib 模块 引入模块 import matplotlib.pyplot as plt 设置图片大小 - figure 展示图片 - show 画图 - 实例化后指定类型画图 plot ...
- php缓存加速优化--Xcache
1.安装软件:cd /usr/local/src/下载软件包wget http://xcache.lighttpd.net/pub/Releases/3.2.0/xcache- 3.2.0.tar.b ...
- 一百二十二:CMS系统之页面抽离和登录页面
将登录和注册需要的共性标签抽离出来做父模板 将css改名为base base模板 {% from 'common/_macros.html' import static %}<!DOCTYPE ...
- Swagger 介绍
简介Swagger 是最流行的 API 开发工具,它遵循 OpenAPI Specification(OpenAPI 规范,也简称 OAS).Swagger 可以贯穿于整个 API 生态,如 API ...
- 配置yum镜像源
centos7配置本地yum源 先从官网下载centos7镜像 以centos7.4 为例 CentOS-7-x86_64-Everything-1804 [root@kangvcar ~]# mv ...