当前位置: 首页 > article >正文

C++泛编程(4)

类模板高级(1)

  • 1.类模板具体化
    • 部分具体化
    • 完全具体化
  • 2.类模板与继承

1.类模板具体化

有了函数模板具体化的基础,学习类模板的具体化很简单。类模板具体化有两种方式,分别为部分具体化和完全具体化。假如有类模板:

template<class T1,class T2>
class AA 
{
    public:
        T1 m_a;
        T2 m_b;
        AA(T1 a,T2 b):m_a(a),m_b(b)
        {
            cout<<"类模板构造函数"<<endl;
        }
        void show();
};
template<class T1,class T2>
void AA<T1,T2>::show()
{
    cout<<m_a<<" "<<m_b<<endl;
}

这里把方法写在类外是为了更好地区分语法上的差别。这个模板的部分具体化和完全具体化有什么差别呢?

部分具体化

部分具体化是类模板特有的,它是指模板类的部分通用类型具有指定的数据类型,示例如下:

template<class T1>
class AA<T1,string>
{
    public:
        T1 m_a;
        string m_b;
        AA(T1 a,string b="ZhangSan"):m_a(a),m_b(b)
        {
            cout<<"类模板部分具体化构造函数"<<endl;
        }
        void show();
};
template<class T1>
void AA<T1,string>::show()
{
    cout<<m_a<<" "<<m_b<<endl;
}

这就是AA模板类的一个不完全具体化版本了。这个AA模板缺省了一个通用类型参数,在类外对方法进行定义时需要指出AA的两个模板参数,具体参数也不可以省略,其余不变。

完全具体化

完全具体化就是类模板完全没有通用参数,它才像是函数模板具体化,举例如下:

template<>
class AA<char,string>
{
    public:
        char m_a;
        string m_b;
        AA(char a='m',string b="ZhangSan"):m_a(a),m_b(b)
        {
            cout<<"类模板部分具体化构造函数"<<endl;
        }
        void show();
};
void AA<char,string>::show()
{
    cout<<m_a<<" "<<m_b<<endl;
}

这里有一个细节需要大家注意,我们在类外定义方法时不再需要写template标识符,但依然需要注明AA的两个具体的模板参数。
下面我们来调用一下模板类,看看调用的优先级:

int main()
{
    AA<int,int> aa(10,20);
    aa.show();
    AA<int,string> bb(10);
    bb.show();
    AA<char,string> cc('w',"LiSi");
    cc.show();
}

在这里插入图片描述
可以看到,如果满足完全具体化类的条件,会优先使用完全具体化类,如不满足,满足不完全具体化类条件优先使用不完全具体化类。只有当二者都不满足时才会使用普通的模板类。

2.类模板与继承


http://www.kler.cn/a/228922.html

相关文章:

  • Python爬取豆瓣图书网Top250 实战
  • 讲一下ZooKeeper的持久化机制?
  • Vue前端框架概述
  • Sentinel配置流控规则详解
  • thinkphp6 + redis实现大数据导出excel超时或内存溢出问题解决方案
  • opencv进行人脸识别环境搭建
  • 免交互 、 字符处理与高级变量
  • JavaWeb之HTML-CSS --黑马笔记
  • 【node】Node.js的常用内置模块:
  • shell中正则表达式
  • 爬虫(二)
  • CGAL-3D 凸包算法
  • Three.js学习6:透视相机和正交相机
  • 【机器学习】基于集成学习的 Amazon 用户评论质量预测
  • 如何使用MCSM搭建我的世界Java版服务器并实现远程联机游戏
  • 离线使用Element UI和Vue
  • 在bash或脚本中,如何并行执行命令或任务(命令行、parallel、make)
  • 2024美赛数学建模A题思路分析 - 资源可用性和性别比例(2)
  • 机器学习基础、数学统计学概念、模型基础技术名词及相关代码个人举例
  • 【网站项目】037物流管理系统
  • MySQL-----约束
  • Linux文件编译
  • Echarts饼图动态赋值
  • 在 MacOS 上虚拟化 x86Linux 的最佳方法(通过 Rosetta)
  • Unity Shader 滚动进度条效果
  • Vue中v-for列表渲染为什么必须绑定key属性