泛型&函数模板&类模板

2021-08-24  本文已影响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;
}

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

三.模板实现机制

四.类模板

#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;
}

五.类模板的成员函数

六.模板类继承问题

七.

图片.png
上一篇下一篇

猜你喜欢

热点阅读