模板和泛型编程的关注重点在编译期,所有的行为都在编译期确定,因此其规则和玩法也有自己特殊的一套,和其他模块不通用。

了解隐式接口和编译期多态

  • 元编程------编译器多态,决定哪个重载函数被调用

  • class的特点:

    • 显示接口

    • 运行期多态

  • template的特点:

    • 隐式接口

    • 编译器多态,模板的具现和函数的重载

了解typename的双重含义

  • 声明template参数时,前缀关键字class和typename可以互换

  • 使用typename关键字声明嵌套从属类型名称,但不可以出现在基类列表和初始化里列表中

  • 嵌套从属名称

template<typename C>
void Print2Nd(const C& container)
{
...
typename C::const_iterator iter(container.begin()) //确认是类型不是名称
...
} //C::const_iterato 从属嵌套类型(名称中依赖于template类型参数)

学习处理模板化基类内的名称

  • 在Derived class template中调用base class template的函数时,直接调用编译不过,可以使用如下方法:

    • this->xxx (建议)

    • basename::xxx

    • using basename::xxx

class CompanyA{
public:
CompanyA(){} void Send()
{
cout<<"CompanyA::Send()"<<endl;
}
}; class CompanyB{
public:
CompanyB(){} void Send()
{
cout<<"CompanyB::Send()"<<endl;
}
}; template<typename Company>
class Sender{
public:
Sender(){} void SendMsg()
{
Company c;
c.Send();
}
}; template<typename Company>
class LogSender: public Sender<Company>
{
public:
using Sender<Company>::SendMsg; void LogSendMsg()
{
cout<<"LogSender::LogSendMsg() before"<<endl; SendMsg(); //单独使用错误,配合using使用ok
this->SendMsg(); //OK
Sender<Company>::SendMsg(); //OK cout<<"LogSender::LogSendMsg() after"<<endl;
} };

将与参数无关的代码抽取template

  • 不要将函数参数提取为template,这样导致代码冗余

运用成员函数模板接受所有兼容类型

  • 使用模板成员函数生成可接受和兼容所有类型的函数,包括构造函数

template<typename U>
class A
{
public:
template<typename T>
A(A<T>& other)
{
...
}
};
  • 如果将构造函数声明为模板函数,为了阻止编译器生成默认的构造函数,你必须明确声明一个非模板的构造函数

需要类型转换时请为模板定义非成员函数

  • template在推倒虑隐式转换

  • 对比“定义no-member函数进行类型转换”这一条规则

template<typename T>
const Rational<T> doMutliply(const Rational<T>& lhs, const Rational<T>& rhs)
{
...
} template<typename T>
class Rational
{
public:
...
//声明为friend函数的目的是tempalte推倒,保证编译通过,根本目的是提供一个使用是所有类型的乘法
frined const Rational<T>operator*(const Rational<T>& lhs, const Rational<T>& rhs)
{
return doMutliply(lhs, rhs);
}
}

请使用traits classes表现类型信息

  • 需要了解STL编程,可以参考《STL源码剖析》一书

  • 运用到模板、元编程等知识

了解template元编程

  • 元编程将运行期的工程提前到编译期,错误的发现更早,效率更高

高效C++:模板和泛型编程的更多相关文章

  1. C++ 模板与泛型编程

    <C++ Primer 4th>读书笔记 所谓泛型编程就是以独立于任何特定类型的方式编写代码.泛型编程与面向对象编程一样,都依赖于某种形式的多态性. 面向对象编程中的多态性在运行时应用于存 ...

  2. C++ Primer 学习笔记_76_模板与泛型编程 --模板定义[续]

    模板与泛型编程 --模板定义[续] 四.模板类型形參 类型形參由keywordclass或 typename后接说明符构成.在模板形參表中,这两个keyword具有同样的含义,都指出后面所接的名字表示 ...

  3. C++ Primer 学习笔记_84_模板与泛型编程 --模板特化

    模板与泛型编程 --模板特化 引言: 我们并不总是能够写出对全部可能被实例化的类型都最合适的模板.某些情况下,通用模板定义对于某个类型可能是全然错误的,通用模板定义或许不能编译或者做错误的事情;另外一 ...

  4. C++ Primer 学习笔记_77_模板与泛型编程 --实例化

    模板与泛型编程 --实例化 引言: 模板是一个蓝图,它本身不是类或函数.编译器使用模板产生指定的类或函数的特定版本号.产生模板的特定类型实例的过程称为实例化. 模板在使用时将进行实例化,类模板在引用实 ...

  5. C++ Primer 学习笔记_85_模板与泛型编程 --模板特化[续]

    模板与泛型编程 --模板特化[续] 三.特化成员而不特化类 除了特化整个模板之外,还能够仅仅特化push和pop成员.我们将特化push成员以复制字符数组,而且特化pop成员以释放该副本使用的内存: ...

  6. C++ Primer 学习笔记_75_模板与泛型编程 --模板定义

    模板与泛型编程 --模板定义 引言: 所谓泛型程序就是以独立于不论什么特定类型的方式编写代码.使用泛型程序时,我们须要提供详细程序实例所操作的类型或值. 模板是泛型编程的基础.使用模板时能够无须了解模 ...

  7. C++ Primer 学习笔记_76_模板和泛型编程 --模板定义[继续]

    模板和泛型编程 --模板定义[续] 四.模板类型形參 类型形參由keywordclass或 typename后接说明符构成.在模板形參表中,这两个keyword具有同样的含义,都指出后面所接的名字表示 ...

  8. C++ Primer 学习笔记_79_模板与泛型编程 --模板编译模型

    模板与泛型编程 --模板编译模型 引言: 当编译器看到模板定义的时候,它不马上产生代码.仅仅有在用到模板时,假设调用了函数模板或定义了模板的对象的时候,编译器才产生特定类型的模板实例. 一般而言,当调 ...

  9. c++模板 与 泛型编程基础

    C++模板 泛型编程就是以独立于任何特定类型的方式编写代码,而模板是泛型编程的基础. (1)定义函数模板(function template) 函数模板是一个独立于类型的函数,可以产生函数的特定类型版 ...

随机推荐

  1. .Net Core Configuration源码探究

    前言     上篇文章我们演示了为Configuration添加Etcd数据源,并且了解到为Configuration扩展自定义数据源还是非常简单的,核心就是把数据源的数据按照一定的规则读取到指定的字 ...

  2. Vmware虚拟机克隆以及关闭防火墙

    vmware虚拟机克隆之后,一定要修改克隆机器的mac地址和IP上网地址,不能和之前的机器一样

  3. 同步/异步/阻塞/非阻塞/BIO/NIO/AIO各种情况介绍

    常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数据,然后使用适合的视图展示详情数据. 如果网速很慢,代码发起一个HTTP请求后,就卡住不动了,直到十几秒后才拿到HTT ...

  4. 使用TimerTask创建定时任务

    使用TimerTask创建定时任务,打包之后应用于linux系统 step1:创建java项目 step2:代码实现 定时任务实现类CreateTask.java是打印操作者的名字 配置准换类Conf ...

  5. ceph对象存储RADOSGW安装与使用

    本文章ceph版本为luminous,操作系统为centos7.7,ceph安装部署方法可以参考本人其他文章. [root@ceph1 ceph-install]# ceph -v ceph vers ...

  6. 痞子衡嵌入式:利用i.MXRT1xxx系列ROM提供的FlexSPI driver API可轻松IAP

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT系列ROM中的FlexSPI驱动API实现IAP. 痞子衡的技术交流群里经常有群友提问: i.MXRT中的FlexSPI驱动 ...

  7. GraphicsLab Project 之 Screen Space Planar Reflection

    作者:i_dovelemon 日期:2020-06-23 主题:Screen Space Planar Reflection, Compute Shader 引言 前段时间,同事发来一篇讲述特化版本的 ...

  8. 【树形dp】Farmcraft

    题目 In a village called Byteville, there are houses connected with N-1 roads. For each pair of houses ...

  9. LeetCode59. 螺旋矩阵 II

    这题和第54题类似,都是套一个搜索的模板. 用dx和dy表示方向,方向的顺序是先向右,再向下,再向左,再向上,再向右... 如果"撞墙"了就需要改变到下一个方向."撞墙& ...

  10. 使用vs2019加.net core 对WeiApi的创建

    vs2019创建webapi 1.创建新的项目 2.选择.NET CORE的ASP .NET CORE WEB应用程序 3.定义项目名称和存放地点 4.选择API创建项目 5.删除原本的无用的类 6. ...