你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

C++——类模板的深入学习

[复制链接]
gaosmile 发布时间:2020-8-26 22:22
一、类模板的深入学习:
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.out
void 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.out
bool Equal(T a, T b)
1
bool Equal<double>(double a, double b)
1

注解:当需要重载函数模板时,优先考虑使用模板特化;当模板特化无法满足需求,再使用函数重载
二、总结:
  • 类模板可以定义任意多个不同的类型参数
  • 类模板可以被部分特化和完全特化
  • 特化的本质是模板的分开实现
  • 函数模板只支持完全特化
  • 工程中使用模板特化代替类(函数)重定义

好了,今天的分享就到这里,如果文章中有错误或者不理解的地方,可以交流互动,一起进步。

收藏 评论0 发布时间:2020-8-26 22:22

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版