c++模板(template)入门介绍

函数模板

文章目录

  • 函数模板
    • 函数模板的调用方式
      • 注意事项
    • 普通函数与函数模板的调用规则
    • 模板具体化
  • 类模板
    • 代码示例
    • 类模板与函数模板的区别
    • 类模板作为函数参数
    • 类模板分文件编写

代码示例

#include
#include

using namespace std;


//这里使用函数模板 T
template
void swapValue(T & a, T & b) {
	T temp = a;
	a = b;
	b = temp;
}

//多个模板参数声明方式
void func(T1 & t1,T2& t2) {
	cout << t1 << endl;
	cout << t2 << endl;
}

int main() {

	int a = 10, b = 20;
	cout << "a=" << a << "  b=" << b << endl;
	swapValue(a, b); //类型自动推导
	cout << "a=" << a << "  b=" << b << endl;

	float c = 12.34, d = 23.43;
	cout << "c=" << c << "\td=" << d << endl;
	swapValue(c, d);//显式指定类型
	cout << "c=" << c << "\td=" << d << endl;

    func(a,c);
    func(b,d)
    
	system("pause");
	return 0;
}

函数模板的调用方式

  • 自动推导类型

    swapValue(a, b);
    
    //自动推导不会发生隐式类型转换(例如 char-> int)
    int a =10;
    char c='v';
    swapValue(a,c) //错误
    
  • 显式指定类型

    swapValue(c, d);
    
    //显式类型会发生隐式类型转换
    int a =10;
    char c='v';
    swapValue(a,c) //正确
    

注意事项

  • 自动推导出来的类型必须一致

    template
    void swapValue(T & a, T & b) {
    	T temp = a;
    	a = b;
    	b = temp;
    }
    
    
    int a=10;
    float b=4.0;
    swapValue(a,b);//错误,类型不一致
    
  • 必须推断出参数的类型才能使用

    template
    void fun() {
    
    }
    
    int main(){
        fun(); //错误,虽然函数没有使用T,但是调用的时候编译器需要推断出T的类型
        fun();//正确,显式指定一个类型即可
      
        return 0;
    }
    

普通函数与函数模板的调用规则

  • 如果函数模板和普通模板都可以调用,优先使用普通函数

  • 可以通过空模板参数列表强制调用模板函数

    fun<>();
    
  • 函数模板可以发生重载

  • 如果函数模板可以发生更好的匹配,则优先使用函数模板

模板具体化

#include
#include


using namespace std;

class Person {
public:
	int age;
	string name;
};

template
void swapValue(T & a, T & b) {
	T temp = a;
	a = b;
	b = temp;
}

//当传入Person类型时,使用下面的具体化函数模板
template<> void swapValue(Person & p1, Person& p2) {
	//int agetmp = p1.age;
	//string nametmp = p1.name;
	//p1.age = p2.age;
	//p1.name = p2.name;
	//p2.age = agetmp;
	//p2.name = nametmp;
	cout << "person swap is called..." << endl;
}



int main() {

	int a = 10, b = 20;
	cout << "a=" << a << "  b=" << b << endl;
	swapValue(a, b);
	swapValue(a, b);
	cout << "a=" << a << "  b=" << b << endl;

	
	Person p1, p2;
	swapValue(p1, p2);

	system("pause");
	return 0;
}

类模板

代码示例

class Data

#include
#include
template
class Data
{
	T data;
public:
	void setValue(T v) {
		data = v;
	}

	T getData() {
		return data;
	}
};

MainApp.cpp

int main(){
    
	Data data;
	data.setValue(10);
	cout << data.getData() << endl;

	system("pause");
	return 0;
}

类模板与函数模板的区别

  • 类模板没有自动类型推导
  • 类模板在模板参数列表有默认类型参数
template
class Data
{
	T data;
public:
	void setValue(T v) {
		data = v;
	}

	T getData() {
		return data;
	}
};



Data<> data; //这里使用了默认类型参数,int,里面可以不写int,但是必须有尖括号<>

类模板作为函数参数

  • 三种方式
    • 指定传入类型
    • 函数参数模板化
    • 整个类模板化
template
class Data
{
	T data;
public:
	void setValue(T v) {
		data = v;
	}

	T getData() {
		return data;
	}
};


//1.指定参数类型
void func1(Data& d){
    
}


//2.参数类型模板化
template
void func2(Data& d){
    // typeid()可以查看运行时参数的类型
    cout<
void func3(T& d){
    
}

类模板分文件编写

  • 普通类份文件编写
    • Class.h 类的声明
    • Class.cpp 成员函数实现
    • 在main中包含Class.h
  • 对类模板而言,这样会产生错误
    • 将所有函数实现和声明写在一个文件中,并且命名为 class.hpp

你可能感兴趣的:(#,c++,后端,c++,类)