• 读书笔记--模板与泛型编程


    • 了解隐式接口和编译期多态
      •   编译期多态和运行期多态
        •   运行期多态就好比是virtual函数再运行的时候才确定该virtual函数该被绑定为哪个函数,运行的时候才确定函数类型。
        •   编译期多态就好比是泛型编程和模板编程中,在编译的时候才确定哪个函数该被调用,根据函数的类型去确定。
      •   显示接口和隐式接口
        •   显示接口由函数的签名式构成
          class widget{
          public:
              widget();
              virtual ~widget();
              virtual std::size_t size() const;
              virtual void normalize();
              void swap(widget& other);
          };
          //这个其中:上述的这些函数都构成了这个public的显示接口
        • 隐式接口:由一组表达式组成;if (w.size()>10 && w!=somenastywidget)...

      •   classes和templates都支持接口和多态;对classes而言接口是显示的,一以函数签名为中心。多态是通过virtual函数发生在运行期;对template参数而言,接口是隐式的,基于有效表达式。多态则是通过template具现化和函数重载解析发生于编译期。



    • typename的意义
      •   在template声明式中,class和typename没有什么不同。
        template <class T> class widget;
        template <typename T>class widget;
      •   从属名称和谓非从属名称
        •   从属名称(dependent typename):表示这个变量名称是依赖于template参数的,有模板参数确定的。
          •   利用这个从属名称可能有时候会发生名称晦涩难懂,或者是名称过长导致名称无法解析。这个时候我们可以使用typename关键字,可以让编译器知道某个长名称是一个参数类型,这样可以消除歧义。
          •   一般我们在template中指涉了一个从属类型名称,就要在它前面添加关键字typename。
          •   特殊:typename不可以出现在base classes list内的从属类型名称之前,也不可在member initialization list中作为base class修饰符。
        •   谓非从属名称(non-dependent typename):这个变量是不依赖与template参数的,是一个正常的变量名称。

      •   typedef:作用是用一个简短的名称替换一个较长的名称
        typedef typename std::iterator_traits<itrat>::value_type value_type;
        //在这里 typename是指定从属名称,typedef是让这个长的从属名称变为短的value_type。





    • 学会处理模板化基类内的名称
      •   可以在派生类模板中内通过this->指涉base class templates内的成员名称,或者籍由一个明白写出的base class资格修饰符完成




    • 将于参数无关的代码抽离templates
      •   templates生成多个classes和多个函数,所以任何template代码都不该与某个造成膨胀的template参数产生相依关系。
      •   因非类型末班参数而造成的代码膨胀往往可以消除,做法是以函数参数或class成员变量替换template参数。
      •   因类型参数而造成的代码膨胀往往可以降低,做法是让带有相同二进制表述的具现类型共享实现码。




    • 运用成员函数模板接收所有兼容类型
      •   成员模板函数
        template <typename T>
        class smartptr{
        public:
            template<typename U>
            smartptr(const smartptr<U> &other);//成员模板函数
        };
      •   请使用成员模板函数生成可以收所有兼容类型的函数;如果你声明成员模板函数用于泛化copy构造函数和泛化assignment操作,你还是需要声明正常的copy构造函数和泛化assignment操作





  • 相关阅读:
    难点总结:Jquery动态加载数据库中的数据(解答人:郭哲 方式:讲述jquery原理及一些函数的使用方法,学会看帮助文档)
    JavaScript window.location对象
    [实用向]Win32系统直接读取登陆用户密码
    Tarjan Pascal程序
    贴nescafe 26 div2两道程序
    NOIP2012国王游戏
    NOIP2012 classroom渣线段树
    noip2012考前水的一些渣代码
    [NOIP2012]Day1完挂,回家养猪
    【凸包】含共线判定O(N^2)
  • 原文地址:https://www.cnblogs.com/Kobe10/p/5744441.html
Copyright © 2020-2023  润新知