美文网首页
C++基础一文通(五)泛型 / 模板

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

作者: 熊爸天下_56c7 | 来源:发表于2022-08-12 08:41 被阅读0次

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

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

一. 函数模板

1. 函数模板作用:

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

2. 语法

template<typename T>
函数声明或定义

解释:

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

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

//利用模板提供通用的交换函数
template<typename T>
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<int>(a, b);

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

}

int main() {

    test01();

    system("pause");

    return 0;
}

注意 :

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

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

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

#include<iostream>
using namespace std;

#include <string>

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

//普通函数模板
template<class T>
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 <string>
//类模板 
// AgeType 默认int
template<class NameType, class AgeType = int>   


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 <string ,int>p("孙悟空", 1000); //必须使用显示指定类型的方式,使用类模板
    p.showPerson();
}

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

int main() {

    test01();

    test02();

    system("pause");

    return 0;
}

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

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

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

相关文章

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

    C++另一种编程思想称为 ==泛型编程== ,主要利用的技术就是模板 C++提供两种模板机制:函数模板和类模板 一...

  • 模板特化

    模板是C++泛型编程编程的基础,STL从头到尾都是模板泛型编程 函数模板 类模板 几个需要注意的点1. 类模板的和...

  • C++模板

    描述 所谓泛型编程即是以一种独立于特定类型的方式进行编程。而在C++中,模板是泛型编程的基础。模板大致分为函数模板...

  • 极客班STL与泛型编程(第一周笔记)

    C++模板 什么是泛型编程和模板? 泛型是一种编程思想,而模板是泛型编程在C++上的实现方法 以往的函数都会是有固...

  • Geekband C++ 第五周

    概述 C++模板简介 函数模板 C++类模板 操作符重载 泛型编程 容器

  • C++ 泛型(模板)函数

    标签(空格分隔): C/C++编程 泛型基础 所谓泛型编程就是类型参数化 首先我们需要声明一个模板 在声明参数类别...

  • 模板和泛型编程

    模板是C++中泛型编程的基础。一个模板就是一个创建类或函数的蓝图或者说公式。当使用vector这样的泛型类型,或者...

  • 【跟戴铭学iOS编程理顺核心知识点】读书笔记1.2泛型

    1.2 Swift的泛型 泛型的概念最早出自c++模板,Swift和C++模板设计的思路是一致的。 既然Swift...

  • 关于STL与泛型编程学习感想一(博览网)

    C++标准库与泛型编程 泛型编程(Generic Programming)就是使用模板(template)为主要工...

  • C++类模板,你看我就够了

    C++中有一个重要特性,那就是模板类型。类似于Objective-C中的泛型。C++通过类模板来实现泛型支持。 1...

网友评论

      本文标题:C++基础一文通(五)泛型 / 模板

      本文链接:https://www.haomeiwen.com/subject/ogejirtx.html