C++函数模板

来源:互联网 发布:江南大学网络教育好吗? 编辑:程序博客网 时间:2024/05/18 12:43

一、函数模板的概念

       函数模板是通用的函数描述,使用泛型来定义函数,其中的泛型可用具体的类型(如int, double)替换。通过将类型作为参数传递给模板, 可使编译器生成该类型的函数。由于模板允许以泛型的方式编写程序, 因此也被称为通用编程。由于类型是用参数表示的,因此模板特性也被称为参数化类型。

     模板并不创建任何函数, 只是告诉编译器如何定义函数。

     函数模板不能缩短可执行程序,最终生成的代码不包含任何模板,而只是包含了为程序生成的实际函数。使用模板的好处是,它使生成多个函数定义更简单,更可靠。

     通常将模板放在头文件中,并在需要使用模板的文件中包含头文件。

二、函数模板的使用

      1. 模板原型声明

        template <typename T>    //typename 是关键字 T 是模板名称

        void Swap (T &a, T &b)

      2. 建立一个模板

       template <typename  T>   //建立一个模板,并将类型命名为T。

       void Swap(T &a, T &b)

      {

          T  temp;

          temp=a;

         a=b;

         b=temp;

       }

      3. 具体参数类型传递

        调用函数时, 将具体参数类型传递给编译器,由编译器生成该函数的int 类型的定义。

        int i=10;

        int j=20;

        swap( i,j);

三、重载的模板

     需要多个对不同类型使用同一种算法时可以使用模板。但是并非所有的类型都使用完全相同的算法,这时可使用重载模板。

    template <typename T>

    void Swap( T&a, T &b);   

    template <typename T>

    void Swap( T *a, T *b, int n);

四、显示具体化( explicit specialization)

       显示具体化是一个具体化函数定义,其中包含所需的代码,当编译器找到与函数调用匹配的具体化定义时,将使用该定义,而不再寻找模板。

       1.c++98标准定义:

        对于给定的函数名,可以有非模板函数,模板函数和显示具体化模板函数以及它们的重载函数。

        显示具体化的原型和定义以template<>打头,并通过名称来指出类型。

        优先级是:非模板  > 显示具体化 > 模板函数

      2. 显示具体化定义

        template <> void swap< int> (int &, int &)

       template <> void swap (int &, int &) //简化版

五、具体化

     1. 隐式实例化(implicit instantiation):在函数调用时编译器生成相应的一个实例。      

        template <typename T>    //typename 是关键字 T 是模板名称

        void Swap (T &a, T &b)

     2. 显示实例化(explicit instantiation) :直接命令编译器创建创建特定的实例。

  template void Swap <int> (int , int)  //没有尖括号


     3.显示具体化(explicit specialization):

        template <> void swap< int> (int &, int &)

      

  







     

0 0
原创粉丝点击