Table of Contents
说明:
模版的编译分两次:
1. 实例化之前,先检查模版本身代码,查看语法是否正确,如遗漏分号等;
2. 在实例化期间,检查模版代码,查看是否所有的调用都有效,如实例化类型不支持某些函数调用等;
一. 函数模版
#include <string>
#include <iostream>
//1. 函数模版声明、定义
template <typename T>
inline T const & MaxFuncTemplate(T const &T1, T const &T2)
{
return (T1 > T2) ? T1 : T2;
}
//2. 函数模版实例化
void TestTemplate()
{
//整形比较
int iFuncT_A = 100;
int iFuncT_B = 200;
std::cout << "1. Function template Max value= " << MaxFuncTemplate(iFuncT_A, iFuncT_B) << std::endl;
//浮点比较
double dFuncT_A = 100.109;
double dFuncT_B = 200.208;
std::cout << "2. Function template Max value= " << MaxFuncTemplate(dFuncT_A, dFuncT_B) << std::endl;
//整形与浮点(涉及到强制类型转换static_cast,否则编译报错)
std::cout << "3. Function template Max value= " << MaxFuncTemplate(iFuncT_A, static_cast<int>(dFuncT_B)) << std::endl;
//字符串比较
string strA = "hello";
string strB = "world!";
std::cout << "4. Function template Max value= " << MaxFuncTemplate(strA, strB) << std::endl;
}
运行结果:
1. Function template Max value= 200
2. Function template Max value= 200.208
3. Function template Max value= 200
4. Function template Max value= world!
结论:
1. 注意强制类型转换static_cast<类型>(值)的格式使用;
2. 关于模版函数的声明、定义格式;
3. 关于const的使用格式,为便于记忆,采样"类型 const 变量"格式定义,如 int const i,表示整形常量i,int* const i,表示整形指针常量i;
二. 函数模版重载
#include <string>
#include <iostream>
//1. 求两个值的最大者
template <typename T>
inline T const & MaxFuncTemplate(T const &T1, T const &T2)
{
return (T1 > T2) ? T1 : T2;
}
//2. 求三个值的最大者
template <typename T>
inline T const & MaxFuncTemplate(T const &T1, T const &T2, T const &T3)
{
return ::MaxFuncTemplate(::MaxFuncTemplate(T1, T2), T3); //递归嵌套
}
三. 类模版
//类模版格式
template <typename T>
class CStack
{
public:
CStack() {};
virtual ~CStack() {};
private:
T elms;
};
四.类模版特化
类模版特化,与函数重载一样,只是这里是类模版重载,必须在起始处声明一个template <>,然后声明用来特化类模版的类型,这个类型被用做模板实参,且必须在类名的后面指定。类模版特化是为了满足一些比较固定的格式
#include "stdafx.h"
#include <string>
#include <iostream>
//类模版
template <typename T>
class CStack
{
public:
CStack() {
std::cout << "template base" << std::endl;
};
virtual ~CStack() {};
private:
T elms;
};
//类模版特化
template<>
class CStack<int>
{
public:
CStack() {
std::cout << "Quan te hua" << std::endl;
};
virtual ~CStack() {};
private:
int elms;
};
int main()
{
//类模版
CStack<std::string> stackStr;
//类模版特化(int)
CStack<int> stackInt;
return 0;
}
五.类模版局部特化
#include "stdafx.h"
#include <string>
#include <iostream>
//类模版
template <typename T1, typename T2>
class MyClass
{
//....
};
//类模版局部特化(两个模版参数具有相同的类型)
template <typename T>
class MyClass<T, T>
{
//...
};
//类模版局部特化(第2个参数为整形)
template <typename T>
class MyClass<T, int>
{
//...
};
//类模版局部特化(两个模版参数都是指针类型)
template <typename T1, typename T2>
class MyClass<T1*, T2*>
{
//...
};
六. 缺省模版实参
顾名思义,缺省模版实参的意思就是有默认参数。
#include <vector>
#include <deque>
//缺省模版实参(以下缺省为实参为:CONT=std::vector<T>)
template<typename T, typename CONT=std::vector<T>>
class MyClass1
{
//...
};
int main()
{
//使用缺省参数std::vector
MyClass1<int> myClass1;
//使用std::deque
MyClass1<int, std::deque<int>> MyClass2;
return 0;
}