码迷,mamicode.com
首页 > 其他好文 > 详细

第56课 函数模板的概念和意义

时间:2016-06-25 23:02:19      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:

1. 发散性问题:C++中的几种交换变量的方法

(1)宏代码块 VS 函数

【编程实验】变量的交换

#include <iostream>
#include <string>

using namespace std;

//宏定义代码块
#define SWAP(t, a, b)   do                      {                           t c = a;                a = b;                  b = c;              }while(0);

//定义函数方式
void Swap(int& a, int& b)
{
    int c = a;
    a = b;
    b = c;
}

void Swap(double& a, double& b)
{
    double c = a;
    a = b;
    b = c;
}

void Swap(string& a, string& b)
{
    string c = a;
    a = b;
    b = c;
}

int main()
{
    int a = 0;
    int b = 1;
    
    Swap(a, b);   //Swap(int&, int&)
    
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    
    SWAP(int, a, b); //宏代码
    
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    
    double m = 2;
    double n = 3;
    
    Swap(m, n);  //Swap(double&, double&)
    cout << "m = " << m << endl;
    cout << "n = " << n << endl;
    
    SWAP(double, m, n);  //宏代码
    cout << "m = " << m << endl;
    cout << "n = " << n << endl;   
    
    string s = "Santa";
    string c = "Claus";
    
    Swap(s, c);
    
    cout << "s = " << s << endl;
    cout << "c = " << c << endl; 

    SWAP(string,s, c);
    
    cout << "s = " << s << endl;
    cout << "c = " << c << endl; 
    
    return 0;
}

(2)优缺点比较

 

宏义宏代码块

定义函数

优点

代码复用,适合所有类型

真正的函数调用,编译器对类型进行检查

缺点

编译器不知道宏的存在,缺少类型检查

根据类型重复定义函数,无法代码复用

2.新的解决方案——泛型编程

(1)不考虑具体数据类型的编程,集合了上述两种方案的优点。

(2)函数模板:C++中的泛型

  ①一种特殊的函数可用不同类型进行调用

  ②看起来和普通函数很相似,区别是类型可被参数化,如

      template<typename T>

      void Swap(T& a, T& b)

(3)函数模板的语法规则

  ①template关键字用于声明开始进行泛型编程

  ②typename关键字用于声明泛指类型

技术分享 

3. 函数模板的使用

(1)自动类型推导调用

     int a = 0, b = 1;

     Swap(a, b); //自动推导

(2)具体类型显式调用

     float c = 2, d = 3;

     Swap<float>(c, d); //显式调用

【编程实验】函数模板使用初探

#include <iostream>
#include <string>

using namespace std;

template <typename T>
void Swap(T& a, T& b)
{
    T c = a;
    a = b;
    b = c;
}

template <typename T>
void SelectSort(T a[], int len)
{
    for (int i = 0; i < len; i++)
    {
        for(int j = i; j < len; j++)
        {
            if (a[i] < a[j])  //降序
            {
                Swap(a[i], a[j]);
            }
        }
    }
}

template <typename T>
void Println(T a[], int len)
{
    for(int i = 0; i < len; i++)
    {
        cout << a[i] << ", ";
    }
    cout << endl;
}

int main()
{
    int a[5] = {5, 3, 2, 4, 1};
    Println(a, 5);
    SelectSort(a, 5);
    Println(a, 5);
    
    string s[5] = {"Java", "C++", "Pascal", "Ruby", "Basic"};
    
    Println(s, 5);
    SelectSort(s, 5);
    Println(s, 5);   
    
    return 0;
}

4. 小结

(1)函数模板是泛型编程在C++中的应用方式之一

(2)函数模板能够根据实参对参数类型进行推导

(3)函数模板支持显式的指定参数类型

(4)函数模板是C++中重要的代码复用方式

第56课 函数模板的概念和意义

标签:

原文地址:http://www.cnblogs.com/5iedu/p/5617055.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!