【类模板】类模板嵌套

2024-09-05 04:12
文章标签 模板 嵌套

本文主要是介绍【类模板】类模板嵌套,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

类模板嵌套

1.介绍

在类内可以定义类,而这个类也可以使用类模板,因此,我们可以在普通的类内嵌套模板,也可以在类模板内嵌套类模板。这样的模板称为类模板的嵌套。
具体如下:


template<typename T>
class A {
public:template<typename U> //嵌套类模板class OtherC {public:void myfOC();};
};

在这个例子中,我们对 A A A这个类模板中嵌套了另一个类模板 O t h e r C OtherC OtherC,因此这个类模板称为嵌套类模板。

在类内实现 m y f O C myfOC myfOC函数比较简单,我们看看下面的代码,在类外实现嵌套类模板的成员函数:

//类外实现嵌套模板函数
template<typename T>
template<typename U>void A<T>::OtherC<U>::myfOC() {std::cout << "泛化的嵌套函数模板myfOC\n";}

2.嵌套类模板的特化

和一般的模板一样,嵌套类模板也能够特化。下面是嵌套类模板的特化:

template<typename T>
class A {
public:template<typename U> //嵌套类模板class OtherC {public:void myfOC();//全特化嵌套模板template<>class OtherC<char> {public:void myfOC();};void myfunc() {std::cout << "泛化的嵌套函数模板myfunc\n";}
};

这里我们对 O t h e r C OtherC OtherC嵌套类模板进行了特化,也就是特化了 < c h a r > <char> <char>类型的函数。

当然,除了对类内嵌套的类模板特化外,也能对外层的类模板进行嵌套,如下代码所示:
我们为 A A A类型特化了 < d o u b l e > <double> <double>这个类型:

//实现T的全特化嵌套模板
template<>
class A<double> {
public:template<typename U> //嵌套类模板class OtherC {public:void myfOC();};void myfunc() {std::cout << "泛化的函数模板myfunc\n";}
};

3.嵌套类模板的实例化

当我们需要用到嵌套类的时候,我们需要为其指定类型(或是使用其构造函数来推断)。

如果我们只需要用到外层模板的函数,则可以不指定嵌套模板的类型,因此也就不会实例化。

void Test() {//实例化两个模板A<float>::OtherC<int> obj1;//实例化一个模板A<int>obj2;obj2.myfunc(); }

值得注意的是,对于外层模板的特化,我们在类外实现的时候不能加 t e m p l a t e < > template<> template<>,否则会编译失败。

以下代码为 A < d o u b l e > A<double> A<double>的特化中的嵌套类模板在类外的实现:

//template<> 不需要这个
template<typename U>
void A<double>::OtherC<U>::myfOC() {std::cout << "全特化的嵌套函数模板myfOC\n";
}

最后,对于内部嵌套的模板,我们必须对外层类模板进行全特化后,才能对内部的模板进行实例化。
如下,我们必须先特化出 A < d o u b l e > A<double> A<double>才能特化出 A < d o u b l e > : : O t h e r C < c h a r > A<double>::OtherC<char> A<double>::OtherC<char>

以下代码将编译失败:

//这样是错的,不能不指定T类型就指定U的类型
template<typename T>
void A<double>::OtherC<char>::myfOC(){std::cout << "全特化的嵌套函数";
}

而这样是正确的:

//这样是对的,因为A<double>是全特化的,而OtherC<char>也是全特化的
template<>
class A<double> {
public:template<typename U> //嵌套类模板class OtherC {public:void myfOC();};void myfunc() {std::cout << "泛化的函数模板myfunc\n";}
};template<>
void A<double>::OtherC<char>::myfOC() {std::cout << "全特化的嵌套函数myfOC\n";
}

这篇关于【类模板】类模板嵌套的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1137914

相关文章

Java利用Spire.Doc for Java实现在模板的基础上创建Word文档

《Java利用Spire.DocforJava实现在模板的基础上创建Word文档》在日常开发中,我们经常需要根据特定数据动态生成Word文档,本文将深入探讨如何利用强大的Java库Spire.Do... 目录1. Spire.Doc for Java 库介绍与安装特点与优势Maven 依赖配置2. 通过替换

Python实现Word文档自动化的操作大全(批量生成、模板填充与内容修改)

《Python实现Word文档自动化的操作大全(批量生成、模板填充与内容修改)》在职场中,Word文档是公认的好伙伴,但你有没有被它折磨过?批量生成合同、制作报告以及发放证书/通知等等,这些重复、低效... 目录重复性文档制作,手动填充模板,效率低下还易错1.python-docx入门:Word文档的“瑞士

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

Python进行word模板内容替换的实现示例

《Python进行word模板内容替换的实现示例》本文介绍了使用Python自动化处理Word模板文档的常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录技术背景与需求场景核心工具库介绍1.获取你的word模板内容2.正常文本内容的替换3.表格内容的

详解Java中三种状态机实现方式来优雅消灭 if-else 嵌套

《详解Java中三种状态机实现方式来优雅消灭if-else嵌套》这篇文章主要为大家详细介绍了Java中三种状态机实现方式从而优雅消灭if-else嵌套,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录1. 前言2. 复现传统if-else实现的业务场景问题3. 用状态机模式改造3.1 定义状态接口3

SpringBoot集成EasyPoi实现Excel模板导出成PDF文件

《SpringBoot集成EasyPoi实现Excel模板导出成PDF文件》在日常工作中,我们经常需要将数据导出成Excel表格或PDF文件,本文将介绍如何在SpringBoot项目中集成EasyPo... 目录前言摘要简介源代码解析应用场景案例优缺点分析类代码方法介绍测试用例小结前言在日常工作中,我们经

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

Java如何根据word模板导出数据

《Java如何根据word模板导出数据》这篇文章主要为大家详细介绍了Java如何实现根据word模板导出数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... pom.XML文件导入依赖 <dependency> <groupId>cn.afterturn</groupId>