码迷,mamicode.com
首页 > 其他好文 > 详细

模板的特化

时间:2016-04-20 02:15:07      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:c++语言   模板特化

  提起模板,那我们有必要先了解一下泛型编程。

 泛型编程:编写与类型无关的逻辑代码,是代码复用的一种手段。模板是泛型编程的基础。

 模板又分为:类模板和函数模板。

 首先看类模板的特化:

 类模板的特化分为:全特化和部分特化。下面举例说明:

#include<iostream>
using namespace std;
template <typename T1,typename T2>
class Data
{
public:
	Data()
	{
        cout << "Data(T1,T2)" << endl;
	}
	
private:
	T1 t1;
	T2 t2;
};

template <>//全特化
class Data<int, double >
{
public:
	Data()
	{
       cout<<" Data(int, double)" << endl;
	}
private:
	int d1;
	double d2;
};

template <typename T>//部分特化
class Data<T, int >
{
public:
	Data()
	{
		cout << "Data(T,int)" << endl;
	}
private:
	T t1;
	int d1;
};

int main()
{
	Data<int, double> d1;//全特化
	Data<char, int> d2;//部分特化
	Data<int, double> d3;//类模板
	Data<int, char> d4;//类模板
	return 0;
}

 运行结果如下图:

       技术分享

  接下来关于函数模板的特化:

  对于函数模板,却只有全特化,不能偏特化

  模板函数特化形式如下:

   1、关键字template后面接一对空的尖括号<>

   2、再接模板名和一对尖括号,尖括号中指定这个特化定义的模板形参

   3、函数形参表

   4、函数体

 举例如下:

 

template <typename T>//模板函数
int  Compare(T t1, T t2)
{
	if (t1 < t2)
		return 1;
	if (t1 >t2)
		return -1;
	return 0;
		
}

template <>//全特化
int Compare<const char *>(const char * p1, const char *  p2)
{
	return strcmp(p1, p2);
}

int main()
{
	const char *str1 = "1234";
	const char *str2 = "abcd";
	char *str3 = "1234";
	char *str4 = "abcd";
	cout << Compare(str1, str2) << endl;//全特化
	cout << Compare(str3, str4) << endl;//模板函数
	return 0;
}

注意:在模板特化版本的调用中,实参类型必须与特化版本函数的形参类型完全匹配,如果不匹配,编     译器将为实参模板定义中实例化一个实例。


     


本文出自 “10912110” 博客,请务必保留此出处http://10922110.blog.51cto.com/10912110/1765533

模板的特化

标签:c++语言   模板特化

原文地址:http://10922110.blog.51cto.com/10912110/1765533

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!