《我的第一本C++书》 模板实现通用算法 2018/10/9

函数模板-----------模板函数

当编译器发现一个函数模板的调用后,将根据实参的实际数据类型来确定是否匹配函数模板中对应的形参,然后生成一个重载函数,称该函数为模板函数。

//模板函数的声明
template <typename 标识符>
返回值类型   函数名(形参表)
{
    //函数体
}

//其中,typename定义的标识符就是函数模板中抽象的数据类型。在函数模板中,可以使用这种抽象类型作为模板来代替实际的数据类型

//自定义的比较函数模板
//T就是函数模板的参数
template<typedef T>
T mymax(const T a,const T b )
{
	return a>b ?a:b;
}

typedef标识符:函数模板的参数,不同参数可以产生不同版本的函数。在调用模板函数的时候,编译器会根据调用模板函数的参数类型自动推导出模板函数的类型参数。

//显式的调用mymax()函数的STRING类型参数
string strMAX = mymax<string>("chen","liu");
//利用模板特化,实现待定类型的string的模板函数
template <>
string mymax<string> (const string a,const string b)
{
    return a.length()>b.length() ?a:b;
}

类模板

为解决一个算法不可能知道它上一次调用时的数据,为了解决这个问题,将算法组织到一个算法类中,利用类的成员变量来维护算法过程中的数据,利用类的成员函数来代表算法。

//类模板的声明
template <typename 标识符>
{
    //类的定义
}
//定义一个用于比较两个数的类模板
template <typename T>
{
public:
	//构造函数,实际上是一个函数模板
	compare(T a,T b)
		:m_a(a),m_b(b)
		{}
//比较类的接口函数
//类模板中的函数都类似于函数模板
public:
	//返回两个数中的较小值
	T min()
	{
		return m_a>m_b ? m_b :m_a;
	}
	//返回两个数中的较大值
	T max()
	{
		return m_a>m_b ? m_a:m_b;
	}
//类模板的成员变量,其类型将根据类模板实例化时的具体类型而定
private:
	T m_a;
	T m_b;
}

在该段代码中定义了一个用于比较两个数据大小的类模板,这个类模板有两个成员变量,分别用于保存比较的两个数,同时提供了两个成员函数max()和min(),分别返回两个待比较数的较大值和较小值。

int _tmain(int argc,_TCHAR* argv[])
{
	//用int数据类型对类模板进行实例化
	//比较两个整数的大小
	compare<int> intcompare(2, 3);
	wcout << intcompare.max() << "大于" << intcompare.min() << endl;

	//用string数据类型对类模板进行实例化
	//比较两个字符串的大小
	compare<string> intcompare("A", "B");
	wcout << stringcompare.max() << "大于" << stringcompare.min() << endl;
}

猜你喜欢

转载自blog.csdn.net/sugarbank/article/details/82977031