【类模板】类模板嵌套

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

相关文章

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>

Python中Flask模板的使用与高级技巧详解

《Python中Flask模板的使用与高级技巧详解》在Web开发中,直接将HTML代码写在Python文件中会导致诸多问题,Flask内置了Jinja2模板引擎,完美解决了这些问题,下面我们就来看看F... 目录一、模板渲染基础1.1 为什么需要模板引擎1.2 第一个模板渲染示例1.3 模板渲染原理二、模板

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

基于Python实现读取嵌套压缩包下文件的方法

《基于Python实现读取嵌套压缩包下文件的方法》工作中遇到的问题,需要用Python实现嵌套压缩包下文件读取,本文给大家介绍了详细的解决方法,并有相关的代码示例供大家参考,需要的朋友可以参考下... 目录思路完整代码代码优化思路打开外层zip压缩包并遍历文件:使用with zipfile.ZipFil

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

python展开嵌套列表的多种方法

《python展开嵌套列表的多种方法》本文主要介绍了python展开嵌套列表的多种方法,包括for循环、列表推导式和sum函数三种方法,具有一定的参考价值,感兴趣的可以了解一下... 目录一、嵌套列表格式二、嵌套列表展开方法(一)for循环(1)for循环+append()(2)for循环+pyPhWiFd