• 模版与泛型编程<c++ primer>16章


    模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现了真正的代码可重用性。


    一 基本定义 

    模版包括模版类和模版函数。

    定义格式为;template <typename/class T> class和template没有区别。

    inline模版函数:template<class T> inline T min(const T&,const T&);

    模版形参包括类型模版形参和非类型模版形参。

    例如,类型模版形参T,非类型模版形参N

    template <class T,size N> void arrayinit(T (&sparm)[N])

    {

    for (size_t i=0;i!=N;i++)

    parm[i]=0;

    }

    int x[42];double y[10];

    arrayinit(x);//instaniates arrayinit(int(&) [42])

    arrayinit(y);instaniates arrayinit(double(&) [10])

    二  实例化:产生模版的特定类型的实例的过程

    1模版实参推断(从实参推断形参)

    • 多个类型形参的实参必须完全匹配。
    • 类型形参的实参的受限转换。

    (1)const 转换。即const和非const在实例化时互相转换。

    (2)数组或函数到指针的转换。(若形参是引用类型,则不行。因为数组以引用方式传递时,传递整个数组,数组大小是传递参数的一部分)

    2 函数模版的显式实参

    (1)指定实参

    #include <iostream>
    using namespace std;
    template <class T> int sum(T m,T n){cout<<m+n<<endl;};
    int main()
    {
        sum(static_cast<long int>(3),4L);//不转换则为error
        getchar();

    (2)在返回类型中使用类型形参

    显式模版实参,从左到右匹配。

    template <class T1,class T2,class T3>

    T3 sum(T2,T1);

    long val3=sum<long> (i,lng);//error因为尖括号内的long对应的是T1;所有没有给T3指定类型

    long val2=sum<long,int,long>(i,lng);//ok

    三   模版包含类型

    1包含编译类型

    调用函数时,编译器只需要看到函数的声明。一般而言,编译时类定义和函数声明放在头文件,而类成员函数和普通函数放在源文件。

    模板则不同,编译器要求看到定义模版的源代码。所以在头文件中需要增加一条#include包含函数模板定义的源文件。即在头文件中加入#include":utility.cc"

    2分别编译类型

    据说在C++11已经被取消了



  • 相关阅读:
    阅读笔记
    学习小记
    networkx学习笔记
    ORM查询简化
    redis等缓存
    redis相关缓存知识
    Centos7网络配置
    redis安装详细
    redis安装详细
    mobaxterm使用手册
  • 原文地址:https://www.cnblogs.com/catkins/p/5270764.html
Copyright © 2020-2023  润新知