59-类模板深度剖析

来源:互联网 发布:淘宝的支付方式 编辑:程序博客网 时间:2024/06/06 18:13

1、多参数类模版

这里写图片描述

2、类模版可以被特化

这里写图片描述

3、

这里写图片描述

#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 >    // 当 Test 类模板的两个类型参数完全相同时,使用这个实现{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;    }};//完全特化,类模板的参数为空,两个参数都为void*类型时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;    }};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;}void add(T1 a, T2 b)3.5void add(T a, T b)10class Test < T, T >void add(void* a, void* b)Error to add void* param...void add(T1* a, T2* b)1.1

4、注意事项

这里写图片描述

5、问题

这里写图片描述

6、特化深度分析

这里写图片描述

7、

这里写图片描述

#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;//调用重载函数    cout << Equal<double>( 0.001, 0.001 ) << endl;//调用函数模版的完全特化    cout << Equal<>( 0.001, 0.001 ) << endl;//调用函数模版,然后根据参数调用函数模版的完全特化    return 0;}bool Equal(T a, T b)1bool Equal(double a, double b)1bool Equal<double>(double a, double b)1bool Equal<double>(double a, double b)1

8、工程中建议

这里写图片描述

9、小结

这里写图片描述

原创粉丝点击