C++中的模板特化
2014-01-02 12:47
239 查看
《C++ primier》中模板特化有以下描述:
我们并不是总是能够写出对所有可能被实例化的类型都最合适的模板,某些情况下,通用模板定义对于某个类型可能会是错误的,通用模板定义也许不能编译或者做错误的事情,另外一些情况下,可以利用关于类型的一些特殊知识,编写比从模板实例化来的函数更有效率的函数。
模板的特化包括 1 函数模板的特化 2类模板的特化3类模板的成员特化
1.函数模板的特化
上面函数模板特化时,如果去掉template<>,就函数f的重载版本,这与模板特化的效果是不一样的,重载函数的定义会对实参应用常规转换,而特化模板的时候,对实参类型不应用转换,模板特化的版本调用中,实参类型必须与特化版本的函数的形参类型完全匹配,如果不完全匹配,编译器将为实参从模板定义实例化一个实例。
2.类模板的特化
3.模板成员的特化
2中对类模板的特化代码不够简洁,如果只需要特化类中的个别成员,这时可以使用模板成员的特化
我们并不是总是能够写出对所有可能被实例化的类型都最合适的模板,某些情况下,通用模板定义对于某个类型可能会是错误的,通用模板定义也许不能编译或者做错误的事情,另外一些情况下,可以利用关于类型的一些特殊知识,编写比从模板实例化来的函数更有效率的函数。
模板的特化包括 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; }
相关文章推荐
- 重学C++ (十二) 模板特化和偏特化
- C++的模板特化 和 STL中iterator_traits模板的偏特化
- C++之模板特化
- C++模板特化
- c++模板特化
- c++模板特化
- C++ 模板特化以及Typelist的相关理解
- 小解C++模板特化
- 小解C++模板特化
- C++模板及模板特化
- 【干货】C++通过模板特化实现类型萃取实例--实现区分基本类型与自定义类型的memcpy
- STL运用的C++技术(2)——模板特化
- C++模板特化的几种方式类型
- C++模板特化
- C++模板特化的概念
- 使用模板特化定义C++编译期警告
- C++——模板特化和偏特化
- C++模板与泛型(3.模板特化)
- C++模板特化
- C++模板特化