|
一、类模板的深入学习: 1、类模板可以定义任意多个不同的类型参数(这一点和模板函数一样) template < typename T1, typenaem T2 >class Test { public: void add(T1 a, T2 b); } //定义类对象时 Test<int,float> t; 2、类模板可以被特化
特化前: template < typename T1, typename T2 >class Test { }; 特化后: template < typename T >class Test < T , T > { }; 3、类模板的特化类型:
完全特化前: template <typename T1, typename T2 >class Test { }; 完全特化后: template < >class Test < int, int> { }; 代码实践: #include <iostream>#include <string> using namespace std; template < typename T1, typename T2 > class Test { public: void add(T1 a, T2 b) { cout<<"void add(T1 a, T2 b)"<<endl; cout<<a+b<<endl; } }; /* 关于上述第一个类模板的特殊实现,关于指针的特化实现 */ template < typename T1 , typename T2 > class Test < T1*, T2* > { public: void add(T1* a, T2* b) { cout<<"void add(T1* a, T2* b)"<<endl; cout<<*a+*b<<endl; } }; template < typename T >//特化 class Test <T ,T > { public: void add(T a, T b) { cout<<"void add(T a, T b)"<<endl; cout<<a+b<<endl; } void print() { cout<<"class Test < T , T >"<<endl; } }; template < >//完全特化 class Test < void * , void * > { public: void add(void* a, void* b) { cout<<"void add(void* a, void* b)"<<endl; cout<<"error to add void* parm"<<endl; } }; int main() { Test<int, float> t1; Test<long, long> t2; Test<void*, void*> t3; t1.add(1,2.5); t2.add(5,5); t2.print(); t3.add(NULL,NULL); Test< int* , double* > t4; int a =1; double b = 0.1; t4.add(&a,&b); return 0; } 输出结果: root@txp-virtual-machine:/home/txp# ./a.outvoid add(T1 a, T2 b) 3.5 void add(T a, T b) 10 class Test < T , T > void add(void* a, void* b) error to add void* parm void add(T1* a, T2* b) 1.1 4、类模板特化注意事项: (1)特化只是模板的分开实现 本质上是同一个类模板 (2)特化类模板的使用方式是统一的 必须显示指定每一个类型参数 5、类模板特化与重定义有区别吗?函数模板可以特化吗? (1)重定义和特化的不同: 重定义: --一个类模板和一个新类(或者两个类模板) --使用的时候需要考虑如何选择的问题 特化: --以统一的方式类使用类模板的特化类 --编译器自动优先选择特化类 (2)函数模板只支持参数完全特化 函数模板特化前: template < typename T >bool Equal(T a, T b) { return a==b; } 函数模板完全特化后: template < >bool Euqal<void*>(void* a, void* b) { return a==b; } 代码实践: #include <iostream>#include <string> using namespace std; template < typename T1, typename T2 > class Test { public: void add(T1 a, T2 b) { cout << "void add(T1 a, T2 b)" << endl; cout << a + b << endl; } }; /* template < > class Test < void*, void* > // 当 T1 == void* 并且 T2 == void* 时 { public: void add(void* a, void* b) { cout << "void add(void* a, void* b)" << endl; cout << "Error to add void* param..." << endl; } }; */ class Test_Void { public: void add(void* a, void* b) { cout << "void add(void* a, void* b)" << endl; cout << "Error to add void* param..." << endl; } }; template < typename T > bool Equal(T a, T b) { cout << "bool Equal(T a, T b)" << endl; return a == b; } template < > bool Equal<double>(double a, double b) { const double delta = 0.00000000000001; double r = a - b; cout << "bool Equal<double>(double a, double b)" << endl; return (-delta < r) && (r < delta); } bool Equal(double a, double b) { const double delta = 0.00000000000001; double r = a - b; cout << "bool Equal(double a, double b)" << endl; return (-delta < r) && (r < delta); } int main() { cout << Equal( 1, 1 ) << endl; cout << Equal<>( 0.001, 0.001 ) << endl; return 0; } 输出结果: root@txp-virtual-machine:/home/txp# ./a.outbool Equal(T a, T b) 1 bool Equal<double>(double a, double b) 1 注解:当需要重载函数模板时,优先考虑使用模板特化;当模板特化无法满足需求,再使用函数重载 二、总结:
好了,今天的分享就到这里,如果文章中有错误或者不理解的地方,可以交流互动,一起进步。 |
微信公众号
手机版