首页 > 代码库 > C++模版

C++模版

模版分类

模板分为类模板与函数模板

函数模版:为函数写一个模版,在使用函数时需要指出类型.
Template <class(或typename) T>
返回值类型函数名(形参表){.... }

类模版:为类写一个模版,在使用类时需要指出类型.

Template <class(或typename) T>
class 类名{.... }

类模版内函数类外实现:

在类模板外部定义成员函数,template<模板形参列表> 函数反回类型类名<模板形参名>::函数名(参数列表){函数体}
template <class T,class N> 
void test<T,N>::print()
{
	函数体;
}

模版形参的类型与非类型


模版参数可以有多个,参数的类型又分为类型形参和非类型形参
类型形参:模版的参数是一个类型,比如string,int等
非类型形参:模版参数是一个常整形,或者指向外部链接对象的指针.

特化与偏特化


类模板的特化分为全特化与偏特化。
模板特化:为模板中的所有模板参数设定一个具体的类型.
模板偏特化:为模板中的部分模板参数设定一具体的类型,而其余的模板参数仍然使用原来的参数定义.



函数模版:

#include <iostream>
using namespace std;
//普通函数模版
template <class T,class N>
void fun(T a,N b)
{
	cout<<"函数模版"<<endl;
}
//函数模版特化非类型形参
template <int a>
void fun(int b,int c)
{
	cout<<"非类型形参"<<endl;
}
//函数模版特化
template <>
void fun(string a,int b)
{
	cout<<"模版特化"<<endl;
}
int main() 
{
	fun<string,string>("sky","sky");//调用普通函数模版
	fun<string,int>("sky",0);//调用模版特化
	fun<5>(0,0);//调用非类型形参模版
	return 0;
}

类模版:

#include <iostream>
using namespace std;


//普通模版类
template <class T,class N> 
class test
{
public:
	void print();
};
//函数类外实现
template <class T,class N> 
void test<T,N>::print()
{
	cout<<"普通模版类"<<endl;
}
//模版特化,<>表示这是一个模板类,同时在类名后加上特化的类型
template <> 
class test<int,int>
{
public:
	void print()
	{
		cout<<"模版特化"<<endl;
	}
};
//模版偏特化,在类名后加上特化的类型以及模板类型
template <class T> 
class test<T,int>
{
public:
	void print()
	{
		cout<<"模版偏特化"<<endl;
	}
};
int main() 
{
	test<string,string> a;
	a.print();
	test<int,int> b;
	b.print();
	test<string,int> c;
	c.print();
	return 0;
}

注意:

1. 函数模版没有偏特化

2. 不能为同一个模板类型形参指定两种不同的类型

3. 对于模板函数,如果类型参数可以推导,那么可以省略类型参数表