C++ Template

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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值