IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    C++template学习笔记

    cfylee发表于 2014-12-01 05:40:43
    love 0

    1.概述

    C++模板是让C++成为通用型程序设计语言的一个特性,C++的模板机制使人在定义类和函数时以类型作为参数,模板只以来实际使用的时由他的参数而来的性质,并不要求被用作参数的那些不同了类型之间又任何显示的联系。下面介绍一些模板的基本技术:

    1. 定义和使用类模板的基本机制
    2. 函数模板,函数重载和类型推断
    3. 用模板参数刻画通用型算法的策略
    4. 通过多个定义为一个模板提供多种实现
    5. 派生模板

    2.定义使用模板的基本机制

    2.1定义模板

    例子:

    templateclass String {  //template 声明一个模板, C是类型名,并不一定是一个类
        struct Srep;
        Srep *rep;
    public:
        String();
        String(const C*);
        String(const String&);
        C read(int i) const;
    };

    2.2使用模板

    例子:

    String cs; //char类型的Sting
    String us; //unsigned char 类型的String
    String ws;    //wchar_t 类型的String

    从一个模板类和一个模板参数生成一个类声明的过程通常被成为模板实例化,同样适用于模板函数生成函数。

    2.3模板参数

    模板可以有类型参数,可以又常规类型的参数,还可以又模板参数,一个模板也可以又多个参数。
    例子:

    template

    模板参数必须是常量,如常量表达式,具有外部链接的对象,函数地址,或者非重载的指向成员函数的指针。

    2.4函数模板

    定义一个函数模板,如下:

    template void sort(vector&);  //声明
    
    void f(vector& vi, vector& vs) //定义
    {
        sort(vi);
        sort(vs);
    }

    函数模板的参数,函数模板对写出通用型算法很重要,编译器能够从一个调用推断出类型参数和非类型参数,条件是这个调用的函数参数表能够唯一地标识出模板参数的一个集合。

    可以声明多个具有同样名字的函数模板,还可以声明具有同一个名字的多个函数模板和常规函数的组合.
    例子:

    template T sqrt(T);
    template complex sqrt(complex);
    double sqrt(double);
    
    void f(complex z)
    {
        sqrt(2); //sqrt(int)
        sqrt(2.0) //sqrt(double)
        sqrt(z);  //sqrt(complex)
    }

    找出最佳专门化的过程:

    1. 找出能参与这个重载解析的一组函数模板的专门化。
    2. 如果又多个函数都可以调用,则调用最专门化的函数。
    3. 在这组函数上做重载解析,包括那些按照常规函数考虑也应该加上去的常规函数。
    4. 如果一个函数和一个专门化具有同样好的匹配,那么选用函数。
    5. 如果找不到,则是一个错误。

    2.5派生和模板

    一个非模板类派生出一个模板类,例子:

    templateclass Vector : private Vector { /* */ }

    一个模板类派生出一个模板类,例子:

    templateclass vector{ /* */ }
    templateclass Vec : public vector { /* */ }

    成员模板, 一个类或者模板也可以包含本身就是模板的成员,例子:

    template  class complex {
        Scalar re, in;
    public:
        template 
        complex(const complex& c) : re(c.real()), im(c.imag()) { }
        //...
    };
    
    complex cf(0,0);
    complex cd = cf; //float到double的装换

    • 成员模板不能是virtual。

    2.6源代码组织

    1. 在使用模板的编译单位最前面包含(include)有关模板的定义。
    2. 只在使用模板的编译单位最前面(include)有关模板的声明,并且分别编译他们的模板定义。


沪ICP备19023445号-2号
友情链接