C++中的模板特化
来源:互联网 发布:软件鲁棒性 编辑:程序博客网 时间:2024/05/22 05:18
《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;elsereturn -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;}
0 0
- C++中的模板特化
- 【c++】模板的特化
- C++ 模板全特化中的函数特化
- C++ 模板全特化中的函数特化
- C++—模板特化和偏特化
- 【C++】模板类、特化以及偏特化!!!
- Linux C/C++ 模板:主模板、完全特化、局部特化
- C++:函数模板、类模板及其特化
- C++——模板特化和偏特化
- C++——模板特化和偏特化
- C++——模板特化和偏特化
- C++——模板特化和偏特化
- C++模板的特化
- C++模板的特化
- 模板特化
- 模板特化
- 模板特化
- 模板特化
- google 最佳实践 - ListView优化 (Making ListView Scrolling Smooth)
- SAP本地化-银企直连
- VS2010常用快捷键
- C++中如何正确使用const
- CSS属性选择器
- C++中的模板特化
- 小强的HTML5移动开发之路(9)——坦克大战游戏3
- Eclipse 配置安装 Flex 插件
- jQuery应用--$.post,$.get,$.getJSON提交方式
- iOS UIBezierPath类
- .net截取指定长度汉字超出部分以指定的字符代替
- UEditor jsp版上传图片自定义路劲配置
- Eclipse中如何修改SVN的地址
- Nexenta *Raidz* Disk replacement via NMV