C++学习记录-函数模板

一、模板

  • C++的另一种编程思想是 泛型编程 ,主要利用了模板

  • 模板机制有两种,函数模板 和 类模板

二、函数模板

函数模板的作用:

建立一个通用函数,函数的返回值类型和参数类型都不确定,交由系统根据传入的数据类型进行判断。

语法:

1
2
template<typename T>
//函数的定义
  • template:声明创建模板
  • typename:表示后面的符号是一种数据类型,可以用**class(类模板)**替代
  • T:一个名称,可以替换,通常使用大写字母

三、示例

1
2
3
4
5
6
7
8
9
10
template<typename T>//声明使用模板

//函数的定义,返回值,参数的数据类型都交由系统判定
T swaper(T& a, T& b)
{
T temp = a;
a = b;
b = temp;
return a;
}
1
2
3
4
5
//调用函数
string a = "神里绫华";
string b = "神里绫人";
cout << swaper(a, b) << endl;
cout << b << endl;

运行结果:

神里绫人
神里绫华

D:\Work\C艹练习\练手\Project1\Debug\Project1.exe (进程 34684)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

四、函数模板的注意事项

  1. 必须推导出一致的数据类型时,才可以使用

    示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    template<typename T>
    T swaper(T& a, T& b)
    {
    T temp = a;
    a = b;
    b = temp;
    return a;
    }

    //调用
    string a = "神里绫华";
    int c;
    swaper(a, c);
    //错误:没有与参数列表匹配的函数模板实例,参数类型为: (std::string, int)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    template<typename T>
    T swaper(T& a, T& b)
    {
    T temp = a;
    a = b;
    b = temp;
    return 20;
    }

    //调用
    string a = "神里绫华";
    string b = "神里绫人";
    swaper(a, b);
    //错误,C2440 “return”: 无法从“int”转换为“std::basic_string<char,std::char_traits<char>,std::allocator<char>>” Project1 D:\Work\C艹练习\练手\Project1\Project1\源.cpp 11
  2. 必须确定出T的数据类型,才可以使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    template<typename T>
    void test()
    {
    cout << "test" << endl;
    }

    //调用
    test();
    //错误