模板观念与函数模板

简单了解模板观念

C++模板简介

  • 模板(Templates)是C++的一种特性,允许函数或类通过泛型(generic types)的形式表现或运行
  • 模板可以使得函数或类在因对不同类别(types)的时候可以正常工作,而无需为每个类型都写一份代码
  • 一个简单的例子:
    • 如果要写一个取两个数中较大的函数Max,在不适用模板的情况下,我们不得不针对不同的类别(eg: int long char…)提供一种类别的重载

int 型

int Max(int a, int b) {
    return (a > b) ? a : b;
}

long型

long Max(long a, long b) {
    return (a > b) ? a : b;
}

char型

char Max(char a, char b) {
    return (a > b) ? a : b;
}

  • 一个简单的例子

    • 如果使用模板,则可以省去一堆代码,从而将代码原型缩减到非常简介的表达:

      template <typename T> 
      T Max(T a, T b) {
          return (a > b) ? a : b;
      }
  • C++ 主要有两种类型的模板:

    • 类模板(Class template):使用泛型参数的类(classes with generic parameters)
    • 函数模板(Function template):使用泛型参数的函数(Functions with generic parameters)
  • 模板实例化

    • 模板的声明(declaration)其实并未给出一个函数或类的完全定义(definition),只是提供了一个函数或类的语法框架(syntactical skeleton)
    • 实例化时指从模板够检出一个真正的函数或类的过程,比如:

              template <typename T>
              struct Object{....}
              ```           
         - 可以用来构建诸如Object<int>, Object<char>, Object<int*>, Object<MyClass*>等等不同类别的具体实例
      
      - 实例化有两种类型:
        - **显式**实例化-在代码中明确指定要正对哪位类别进行实例化
        - **隐式**实例化-在首次使用时根据具体情况一种合适的型别惊醒实例化
        
      ## C++函数模板
      - 什么时函数模板?
        - **函数模板**是参数化的一族函数(a family of functions)
        - 通过函数模板,可以定义一系列函数,这些函数都是基于同一代码,但是可以用作在不同类别的参数上
      

      template
      inline T Max(const T& a, const T& b) {
      return (a > b) ? a : b;
      }

      - 定义函数模板
        - 定义一个函数模板,反水数中较大一个,该函数有两个参数:(a,b)
        - 参数类别未定,以模板参数T表示
        - 模板参数由关键字typename引入
        - 也可以使用class代替typename来定义类型参数
        - 从语法上讲使用class和使用typename没有区别
        - 单从语义上,class可能会导致误区,即只有类才能作为类别参数;而事实上T所以表达的意思不仅仅只针对类,任何类别都可以
        
      - 参数推导
        - 模板参数是有传递给模板函数的实参所决定的
        - 不允许自动类型转换:每个T必须严格匹配

      Max(1, 2) //两次实参的类型都是int
      Max(1, 2.0) //ERROR:第一参数的类别是int第二参数类别是double

      - 一般有两种处理这种错误的方法:
         1.static_cast<double>或者强制转换参数类型以使两者匹配

      Max(static_cast(1),2.0)

      1. 显示指定T的类别

      Max(1, 2.0)

      
      - 函数模板重载
        - 函数模板也可以像普通函数一样被重载
        - 非模板函数可以和**同名**的模板函数共存
        - 编译器同通过函数模板参数推导来决定使用调用哪个函数

      inline int const& Max(const int const& a, const int const& b)

    template
    inline T const& Max(const T const& a, T const& b)

    template
    inline T const& Max(const T const& a, T const& b, const T const& c)
    ```


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!