您的位置:首页 > 编程语言 > C语言/C++

C++中的模板特化

2014-01-02 12:47 239 查看
《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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: