C++基础一文通(五)泛型 / 模板

C++另一种编程思想称为 ==泛型编程== ,主要利用的技术就是模板

C++提供两种模板机制:函数模板类模板

一. 函数模板

1. 函数模板作用:

建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表。

2. 语法

template
函数声明或定义

解释:

  • template --- 声明创建模板
  • typename --- 表面其后面的符号是一种数据类型,可以用class代替
  • T --- 通用的数据类型,名称可以替换,通常为大写字母

3.利用函数模板简化程序, 提高复用性

//利用模板提供通用的交换函数
template
void mySwap(T& a, T& b)
{
    T temp = a;
    a = b;
    b = temp;
}

void test01()
{
    int a = 10;
    int b = 20;
    
    //swapInt(a, b);

    //利用模板实现交换
    //1、自动类型推导
    mySwap(a, b);

    //2、显示指定类型
    mySwap(a, b);

    cout << "a = " << a << endl;
    cout << "b = " << b << endl;

}

int main() {

    test01();

    system("pause");

    return 0;
}

注意 :

  • 模板必须要确定出T的数据类型,才可以使用
  • 学习模板并不是为了写模板,而是在STL能够运用系统提供的模板

4. 特定的类型的具体化模板

有时候, 我们让某个数据类型输入通用的泛型模板时, 会出现问题, 比如我们的泛型模板是两个值的比较, 我们输入两个整型或浮点都没问题, 但如果输入了数组或对象, 就出现问题了, 此时可以指定特定类型的具体化模板来实现不同类型进不同函数

#include
using namespace std;

#include 

class Person
{
public:
    Person(string name, int age)
    {
        this->m_Name = name;
        this->m_Age = age;
    }
    string m_Name;
    int m_Age;
};

//普通函数模板
template
bool myCompare(T& a, T& b)
{
    if (a == b)
    {
        return true;
    }
    else
    {
        return false;
    }
}


//具体化,显示具体化的原型和定意思以template<>开头,并通过名称来指出类型
//具体化优先于常规模板
template<> bool myCompare(Person &p1, Person &p2)
{
    if ( p1.m_Name  == p2.m_Name && p1.m_Age == p2.m_Age)
    {
        return true;
    }
    else
    {
        return false;
    }
}

void test01()
{
    int a = 10;
    int b = 20;
    //内置数据类型可以直接使用通用的函数模板
    bool ret = myCompare(a, b);
    if (ret)
    {
        cout << "a == b " << endl;
    }
    else
    {
        cout << "a != b " << endl;
    }
}

void test02()
{
    Person p1("Tom", 10);
    Person p2("Tom", 10);
    //自定义数据类型,不会调用普通的函数模板
    //可以创建具体化的Person数据类型的模板,用于特殊处理这个类型
    bool ret = myCompare(p1, p2);
    if (ret)
    {
        cout << "p1 == p2 " << endl;
    }
    else
    {
        cout << "p1 != p2 " << endl;
    }
}

int main() {

    test01();

    test02();

    system("pause");

    return 0;
}

二. 类模板

建立一个通用类,类中的成员 数据类型可以不具体制定,用一个虚拟的类型来代表。

1. 创建类模板

#include 
//类模板 
// AgeType 默认int
template   


class Person
{
public:
    Person(NameType name, AgeType age)
    {
        this->mName = name;
        this->mAge = age;
    }
    void showPerson()
    {
        cout << "name: " << this->mName << " age: " << this->mAge << endl;
    }
public:
    NameType mName;
    AgeType mAge;
};

//1、类模板没有自动类型推导的使用方式
void test01()
{
    // Person p("孙悟空", 1000); // 错误 类模板使用时候,不可以用自动类型推导
    Person p("孙悟空", 1000); //必须使用显示指定类型的方式,使用类模板
    p.showPerson();
}

//2、类模板在模板参数列表中可以有默认参数
void test02()
{
    Person  p("猪八戒", 999); //类模板中的模板参数列表 可以指定默认参数
    p.showPerson();
}

int main() {

    test01();

    test02();

    system("pause");

    return 0;
}

2. 类模板与函数模板区别

类模板与函数模板区别主要有两点:

  • 类模板没有自动类型推导的使用方式
  • 类模板在模板参数列表中可以有默认参数

你可能感兴趣的:(C++基础一文通(五)泛型 / 模板)