美文网首页
泛型&函数模板&类模板

泛型&函数模板&类模板

作者: 李永开 | 来源:发表于2021-08-24 10:44 被阅读0次

一.模板函数

#include <iostream>
using namespace std;

template<class T>//声明一个class类型为T的类,防止编译器报错
void mySwap(T &a, T &b) {
    T temp = a;
    a = b;
    b = temp;
}

int main(int argc, const char * argv[]) {

    int a = 10;
    int b = 20;
    
    mySwap(a, b);//自动类型推导,必须有参数类型才可以推导
    mySwap<int>(a, b);//显示指定类型
    
    cout << "a:" << a << "b:" << b << endl;//a:20b:10
    
    return 0;
}

第三代具体化自定义数据类型

//
//  main.c
//  cdemo
//
//  Created by liyongkai on 2021/6/6.
//

#include <iostream>
using namespace std;

class Person{
public:
    Person(string name) {
        this->name = name;
    }
    string name;
};

template<class T>//声明一个class类型为T的类,防止编译器报错
bool isEquel(T &a, T &b) {
    if (a == b) {
        return true;
    }
    return false;
}

template<> bool isEquel<Person>(Person &a, Person &b) {
    if (&a == &b) {
        return true;
    }
    return false;
}


int main(int argc, const char * argv[]) {

    //没有问题
    int a = 10;
    int b = 20;
    bool i = isEquel(a, b);
    cout << i << endl;//0
    
    
    //如果直接比较两个对象,会报错
    //Invalid operands to binary expression ('Person' and 'Person')
    //会走template<> bool isEquel(Person &a, Person &b) 这个方法
    Person p1("111");
    Person p2("222");
    isEquel(p1, p2);
    bool ii = isEquel(a, b);
    cout << ii << endl;//0

    return 0;
}

二.模板函数与普通函数优先级

  • 如果存在同名的模板函数和普通函数,编译器会优先调用普通函数,如果普通函数没有实现则会报错
  • 如果想要强制调用模板函数,那么可以使用空参数列表myPrint<>(a, b),加个<>
  • 模板也可以重载

三.模板实现机制

  • 编译器并不是把函数模板编译成能够处理任意类型的函数
  • 函数模板通过具体类型生成不同的函数
  • 编译器会对函数模板进行两次编译,在声明的地方对模板代码本身进行编译,在调用的地方对参数替换后的代码进行再次编译

四.类模板

#include <iostream>
using namespace std;

template <class nameType, class ageType = int> //ageType = int 类模板可以有默认类型
class Person{
public:
    nameType name;
    ageType age;
    Person(nameType name, ageType age) {
        this->name = name;
        this->age = age;
    }
};


int main(int argc, const char * argv[]) {

    //Use of class template 'Person' requires template arguments
    //Person p1("tom", 100);
   
    Person<string, int> p1("tom", 100);
    
    return 0;
}

五.类模板的成员函数

  • 类模板的成员函数一开始不会被创建出来,只有运行的时候才去创建

六.模板类继承问题

  • 如果基类是模板类,必须让子类告诉编译器 基类中的T到底是什么类型。如果不告诉,那么无法分配内存,编译不通过class Child:public Base<int>
  • .hpp文件一般都是模板类

七.

图片.png

相关文章

  • 模板特化

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

  • c++模板

    模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。可以使用模板来定义函数和类 函数模板 模板...

  • Geekband C++ 第五周

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

  • android 源码阅读的C++语法准备7 模板 文件和流 ST

    模板 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。 模板是创建泛型类或函数的蓝图或公式...

  • GeekBand.重学C++(5)----STL

    0x00. 模板简介 两种模板:类模板和函数模板 代码重用:允许函数和类以泛型的形式表现和运行,针对各种类型都适用...

  • 1.3.05_C++ 模板

    模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。 模板是创建泛型类或函数的蓝图或公式。库容...

  • JNI基础 -- C++基础知识(函数模板,类模板 )

    函数模板 C++ 中的函数模板就好比Java中的泛型,关键字template声明方式如下: 类模板 依然使用关键字...

  • 模板于数组应用之间的注意点

    模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。模板是创建泛型类或函数的蓝图或公式。库容器...

  • C++函数模板

    函数模板 函数模板与常规函数相比,就是使用template<>定义了泛型,然后在函数中的任意地方使用这个泛型。 如...

  • 泛型&函数模板&类模板

    一.模板函数 第三代具体化自定义数据类型 二.模板函数与普通函数优先级 如果存在同名的模板函数和普通函数,编译器会...

网友评论

      本文标题:泛型&函数模板&类模板

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