模板分为类模板与函数模板
函数模版:为函数写一个模版,在使用函数时需要指出类型.Template <class(或typename) T>
返回值类型函数名(形参表){.... }
类模版:为类写一个模版,在使用类时需要指出类型.
Template <class(或typename) T>
class 类名{.... }
类模版内函数类外实现:
在类模板外部定义成员函数,template<模板形参列表> 函数反回类型类名<模板形参名>::函数名(参数列表){函数体}template <class T,class N>
void test<T,N>::print()
{
函数体;
}#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. 对于模板函数,如果类型参数可以推导,那么可以省略类型参数表
原文地址:http://blog.csdn.net/zsp_skyer/article/details/33775285