C++面向对象高级编程(八)模板
技术在于交流、沟通,转载请注明出处并保持作品的完整性。
这节课主要讲模板的使用,之前我们谈到过函数模板与类模板 (C++面向对象高级编程(四)基础篇)这里不再说明
1.成员模板
成员模板:参数为template,以下面的代码为例,T1和T2 确定下来后, 后面的U1和U2 仍然可以变化,其实可以直接理解成形参类型不确定
template <class T1, class T2>
class pair_test {
public:
typedef T1 first_type;
typedef T2 second_type; T1 first;
T2 second; pair_test(): first(T1()),second(T2())
{
cout<<"类模板"<<endl;
}
pair_test(const T1& a, const T2& b):first(a),second(b) {} template <class U1, class U2> //成员模板
pair_test(const pair_test<U1, U2>& p): first(p.first),second(p.second)
{
cout<<"成员模板"<<endl;
}
template <class X1, class X2>//帮助理解
void test_test(const X1 a, const X2 b)
{
cout<< a << b <<endl;
} };
定义两个测试类
class Base1{};
class Drived1:public Base1{};
class Base2{};
class Drived2:public Base2{};
调用端
int main()
{
pair_test<Drived1, Drived2> p;
pair_test<Base1, Base2> p2(p);//把子类12构成的pair 放进基类12构成的pair中 做参数可以 反之不可以 : 父类指针可以指向子类对象,子类指针不可指向父类对象 int a = ;
int b = ;
p.test_test(a,b);
return ;
}
输出结果

2.模板特化
模板特化:为了满足一些特定的需求,需要对模板进行特化,也就是特殊处理.
先说一下模板泛化,以下面代码为例,只要你指定Key的类型,就可以模板化
template <class Key>
class hash_test {}; //泛化
模板特化就是指定Key的类型做模板化,
template <class Key>
class hash_test
{
public:
hash_test()
{
cout<<"模板泛化"<<endl;
}
}; //泛化 template <>
class hash_test<char> { //特化
public:
size_t operator()(char x) const
{
cout<< "模板特化char" <<endl;
return x;
}
};
调用端
int main()
{
hash_test<int> a;
char c = 'c';
hash_test<char> b;
cout<<b(c)<<endl;
return ;
}
输出结果

3.偏特化
偏特化:模板的偏特化是指需要根据模板的某些但不是全部的参数进行特化.偏特化非为两种,一种是个数上偏,一种是范围上偏.如果你的类模板是针对bool型变量,bool变量的存储只需要一个二进制数,使用一个字节都是在浪费存储空间
a.个数上的偏特化
template <typename T, typename Type>
class vector_test1
{
public:
vector_test1()
{
cout<<"没有偏特化"<<endl;
}
};
//可以转化成 template<typename Type>
class vector_test1<bool, Type>
{
public:
vector_test1()
{
cout<<"个数上的偏特化"<<endl;
}
};
调用端
int main()
{
vector_test1<int,int> a;
vector_test1<bool,int> b;//指定第一个参数
}
输出结果

b.范围偏特化
指定要特化参数的范围,接受一个对象,和接受一个指针为例
template <typename T>
class C
{
public:
C()
{
cout<<"接收对象"<<endl;
}
}; template <typename T>
class C<T*> //只接受指针变量
{
public:
C()
{
cout<<"接收指针"<<endl;
} };
调用端
int main()
{
C<int> c;
C<int*> c1;
return ;
}
输出结果

4 模板 模板参数
模板 模板参数:参数中有一个是模板
template <typename T,template <typename C> class Container>
class XCls {
private:
Container<T> c; public: }; template<typename T>
using Lst = list<T, allocator<T>>;
调用端
int main()
{
// XCls<string, list> mylst1;//编译过不了 容器需要好几个模板参数
XCls<string, Lst> mylst2;//你需要这样用 这个时候 XCLs中的 成员变量c == list<string>
return ;
}
参照<<侯捷 C++面向对象高级编程>>
C++面向对象高级编程(八)模板的更多相关文章
- C++面向对象高级编程(四)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一.Static 二.模板类和模板函数 三.namespace 一.Static 静态成员是“类级别”的,也就是它和类的地位等同,而普通成员是“ ...
- C++面向对象高级编程(九)Reference与重载operator new和operator delete
摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nul ...
- C++面向对象高级编程(七)point-like classes和function-like classes
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.pointer-like class 类设计成指针那样,可以当做指针来用,指针有两个常用操作符(*和->),所以我们必须重载这两个操作 ...
- C++面向对象高级编程(六)转换函数与non-explicit one argument ctor
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.conversion function 转换函数 //1.转换函数 //conversion function //只要你认为合理 你可以任 ...
- C++面向对象高级编程(五)类与类之间的关系
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 本节主要介绍一下类与类之间的关系,也就是面向对象编程先介绍两个术语 Object Oriented Programming OOP面向对象编 ...
- C++面向对象高级编程(三)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 一.拷贝构造 二.拷贝赋值 三.重写操作符 四.生命周期 本节主要介绍 Big Three 即析构函数,拷贝构造函数,赋值拷贝函数,前面主 ...
- C++面向对象高级编程(二)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 知识点1.重载成员函数 知识点2 . return by value, return by reference 知识点3 重载非成员函数 ...
- C++面向对象高级编程(一)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要: 知识点1 构造函数与析构函数 知识点2 参数与返回值 知识点3 const 知识点4 函数重载(要与重写区分开) 知识点5 友元 先以C ...
- python基础之面向对象高级编程
面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个"函数"供使用(可以讲多函数中公用的变量封装到对象中) ...
随机推荐
- Python3.x:常用基础语法
Python3.x:常用基础语法 1,if else语句: 不执行if内的语句,需要用:pass if i>2: #跳过不执行 pass else: print("i= %s" ...
- MR案例:Map-Join
适用场景:一张表十分小[key不可重复].一张表非常大. 用法:在Job提交时,首先将小表加载到 DistributedCache 分布式缓存中,然后从DistributeCache中读取小表解析成 ...
- Hive中排序和聚集
//五种子句是有严格顺序的: where → group by → having → order by → limit ; //distinct关键字返回唯一不同的值(返回age和id均不相同的记录) ...
- 批处理命令 For循环命令详解!
批处理for命令详解FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能!看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号)FOR 参数 %%变量名 IN (相关文 ...
- java并发容器之 SynchronousQueue [转]
SynchronousQueue 这个队列实现了 BlockingQueue接口 该队列的特点 1.容量为0,无论何时 size方法总是返回0 2. put操作阻塞,jquery插件库 直到另外一个 ...
- Hive的三种Join方式
Hive的三种Join方式 hive Hive中就是把Map,Reduce的Join拿过来,通过SQL来表示. 参考链接:https://cwiki.apache.org/confluence/dis ...
- PyTorch源码解读之torchvision.models(转)
原文地址:https://blog.csdn.net/u014380165/article/details/79119664 PyTorch框架中有一个非常重要且好用的包:torchvision,该包 ...
- 从0开始 数据结构 AC自动机 hdu 2222
参考博客 失配指针原理 使当前字符失配时跳转到另一段从root开始每一个字符都与当前已匹配字符段某一个后缀完全相同且长度最大的位置继续匹配,如同KMP算法一样,AC自动机在匹配时如果当前字符串匹配失败 ...
- 读书笔记: Microsot .NET企业级应用架构设计
Microsot .NET企业级应用架构设计 Dino Esposito Andrea Saltarello 编 陈黎夫 译 人民邮电出版社 第一部分 设计原则 第1章 当代架构师和架构 ...
- Asp.Net MVC 缓存设计
Asp.Net MVC 缓存: 1. 可以直接在Controller,Action上面定义输出缓存OutputCache,如下,第一次请求这个Index的时候,里面的代码会执行,并且结果会被缓存起来, ...