C++中的模板特化

本文深入探讨了C++模板特化的概念及其在不同场景下的应用,包括函数模板特化、类模板特化及类模板成员特化。通过具体的代码示例,详细解释了模板特化如何实现更为高效且针对性的功能,以及其与模板重载的区别。

C++ primier》中模板特化有以下描述:

我们并不是总是能够写出对所有可能被实例化的类型都最合适的模板,某些情况下,通用模板定义对于某个类型可能会是错误的,通用模板定义也许不能编译或者做错误的事情,另外一些情况下,可以利用关于类型的一些特殊知识,编写比从模板实例化来的函数更有效率的函数。

模板的特化包括 1 函数模板的特化 2类模板的特化3类模板的成员特化

1.函数模板的特化

#  include <iostream>
using namespace std;
# include <string>
template <typename T>

int f(T & a,T & b)
{
if(a>b)
	return 1;
else if(a==b)
	return 0;
else
	return -1;
}
int f(char * a,char *b)
{
return strcmp(a,b);
}
int main()
{
	char *s1="hello";
	char * s2("world");
	cout<<f(s1,s2)<<endl;  // s1,s2为char *型变量,此时调用特化的版本
	string t1="hello";
	string t2="world";
	cout<<f(t1,t2)<<endl;   //s1,s2为string 型的变量,此时调用模板
	cin.get();
    return 0;
}


上面函数模板特化时,如果去掉template<>,就函数f的重载版本,这与模板特化的效果是不一样的,重载函数的定义会对实参应用常规转换,而特化模板的时候,对实参类型不应用转换,模板特化的版本调用中,实参类型必须与特化版本的函数的形参类型完全匹配,如果不完全匹配,编译器将为实参从模板定义实例化一个实例。

2.类模板的特化

# include <iostream>
using namespace std;
# include <string>
template <typename T>
class Cmp{
public:
	Cmp(T &a,T &b):x(a),y(b){}
	int cmpare();
private:
	T x;
	T y;
};
template <typename T>
int Cmp< T>::cmpare()
{   cout<<"T"<<endl;
    if(x>y)
        return 1;
    else if(x==y)
        return 0;
    else 
        return -1;
}
template <>
class Cmp<char *>
{
public:
	Cmp(char *a,char *b):x(a),y(b){}
	int cmpare();
private:
	char *x;
	char *y;
};
int Cmp<char *>::cmpare()
{
	cout<<"C"<<endl;
return strcmp(x,y);
}
int main()
{   string s1="hello";
    string s2="world";
    Cmp <string> t1(s1,s2);  //s1,s2为string 型的变量,此时调用模板
    cout<<t1.cmpare()<<endl;
    Cmp <char *> t2("hello","world");
    cout<<t2.cmpare()<<endl;   //特化的版本
    cin.get();
    return 0;
}

3.模板成员的特化

2中对类模板的特化代码不够简洁,如果只需要特化类中的个别成员,这时可以使用模板成员的特化

# include <iostream>
using namespace std;
# include <string>
template <typename T>
class Cmp{
public:
	Cmp(T a,T b):x(a),y(b){}
	int cmpare();
private:
	T x;
	T y;
};
template <typename T>
int Cmp< T>::cmpare()
{   cout<<"T"<<endl;
    if(x>y)
        return 1;
    else if(x==y)
        return 0;
    else 
        return -1;
}
template <>
int Cmp<char *>::cmpare()
{
	cout<<"C"<<endl;
return strcmp(x,y);
}
int main()
{   string s1="hello";
    string s2="world";
    Cmp <string> t1(s1,s2);
    cout<<t1.cmpare()<<endl;  //s1,s2为string 型的变量,此时调用模板
    char *p1="hello";
    char *p2="world";
    Cmp <char *> t2(p1,p2);   //调用特化的版本  
    cout<<t2.cmpare()<<endl;
    cin.get();
    return 0;
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值