在前两节中(C++模板详解(一)C++模板详解(二)),我们了解了函数模板和类模板的基本概念和使用方法。在这篇博文里,我们主要来详细地阐述一下"模板的参数声明"这个话题,并且也谈及了函数模板和类模板相结合的使用方式和一些注意事项。

一、函数模板作为普通类和模板类的成员函数

函数模板可以作为普通类和模板类的成员函数。下面的这份代码片段演示了这一点:

  1. template<typename T1>
  2. class List
  3. {
  4. public:
  5. // 位于模板类中的成员函数模板定义:
  6. template<typename T2>
  7. List(const List<T2>& other);
  8. // 错误的写法:不可以是虚函数。
  9. template<typename T1>
  10. virtual void func(T1&& t)
  11. {
  12. }
  13. };
  14. // #1: 在类的外部定义上面的构造函数。
  15. template<typename T1>
  16. template<typename T2>
  17. List<T1>::List(const List<T2>& other)
  18. {
  19. //...
  20. }
  21. class Collection
  22. {
  23. // 位于普通类内部的成员函数模板定义:
  24. template<typename T>
  25. T* alloc()
  26. {
  27. //...
  28. }
  29. // 错误的写法:不可以是虚函数。
  30. template<typename T>
  31. virtual void func(T&& t)
  32. {
  33. }
  34. };

这份代码展示出了很多的概念。

  • 无论是普通类还是模板类,其中的成员函数或是模板成员函数都可以内联地定义在类中,或是定义在类的外部。在外部定义的成员函数模板可以具有多个模板参数子句:一个子句作用于该模板自身,其它子句作用于外围的类模板,其顺序是从最外围的类模板开始,依次到达内部模板。

  • 成员函数模板不可以是虚函数。这是因为,实现虚函数需要使用一个固定大小的虚函数表,每个虚函数都对应虚函数表的一个入口。然而,成员函数模板的实例化个数,要等到整个程序都编译完成时才能确定,这就和"虚函数表的大小是固定的"发生了冲突。所以,成员函数模板不可以是虚函数。

二、模板类可以被嵌套定义在普通类或者模板类中

模板类的定义也是可以嵌套的。例如下面这份示例代码:

  1. // 示例1:模板类可以被嵌套定义在模板类中。
  2. template<typename T1>
  3. class List
  4. {
  5. // 定义并实现。
  6. template<typename T2>
  7. class Node1
  8. {
  9. };
  10. // 定义。
  11. template<typename T2>
  12. class Node2;
  13. };
  14. // 外部实现。
  15. template<typename T1>
  16. template<typename T2>
  17. class List<T1>::Node2
  18. {
  19. };
  20. // 示例2:模板类可以被嵌套定义在普通类中
  21. class Shell
  22. {
  23. // 定义并实现。
  24. template<typename T>
  25. class Inner1
  26. {
  27. };
  28. // 定义。
  29. template<typename T>
  30. class Inner2;
  31. };
  32. // 外部实现。
  33. template<typename T>
  34. class Shell::Inner2
  35. {
  36. };

类似于成员函数的类外实现,内部类的具体实现也同样可以被放到类外进行,它们的书写规则和模板成员函数几乎相同。

三、函数模板声明中的默认参数

函数模板同样可以在声明中提供缺省参数:

  1. template<typename T>
  2. void report(const Stack<T>& stack, int number = 10);
  3. template<typename T>
  4. void fill(const Array<T>& arr, const T& value = T());

由于和普通函数的缺省参数功能相似,具体的注意事项可以直接参看:C++函数详解

C++模板详解(三):参数化声明详解的更多相关文章

  1. 【转】Android编译系统详解(三)——编译流程详解

    原文网址:http://www.cloudchou.com/android/post-276.html 本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接 1.概述 编译Androi ...

  2. Android 之窗口小部件详解(三)  部分转载

    原文地址:http://blog.csdn.net/iefreer/article/details/4626274. (一) 应用程序窗口小部件App Widgets 应用程序窗口小部件(Widget ...

  3. 转:LoadRunner中参数化技术详解

    LoadRunner中参数化技术详解 LoadRunner在录制脚本的时候,只是忠实的记录了所有从客户端发送到服务器的数据,而在进行性能测试的时候,为了更接近真实的模拟现实应用,对于某些信息需要每次提 ...

  4. python设计模式之装饰器详解(三)

    python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...

  5. 【C/C++开发】C++11 并发指南三(std::mutex 详解)

    本系列文章主要介绍 C++11 并发编程,计划分为 9 章介绍 C++11 的并发和多线程编程,分别如下: C++11 并发指南一(C++11 多线程初探)(本章计划 1-2 篇,已完成 1 篇) C ...

  6. .NET DLL 保护措施详解(三)最终效果

    针对.NET DLL 保护措施详解所述思路完成最终的实现,以下为程序包下载地址 下载 注意: 运行环境为.net4.0,需要安装VS2015 C++可发行组件包vc_redist.x86.exe.然后 ...

  7. [转]hibernate三种状态详解

    本文来自 http://blog.sina.com.cn/u/2924525911 hibernate 三种状态详解 (2013-04-15 21:24:23) 转载▼   分类: hibernate ...

  8. WebSocket安卓客户端实现详解(三)–服务端主动通知

    WebSocket安卓客户端实现详解(三)–服务端主动通知 本篇依旧是接着上一篇继续扩展,还没看过之前博客的小伙伴,这里附上前几篇地址 WebSocket安卓客户端实现详解(一)–连接建立与重连 We ...

  9. 多表连接的三种方式详解 hash join、merge join、 nested loop

    在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式.多表之间的连接有三种方式:Nested Loops,Hash Join 和 Sort Merge Join.具体适用哪 ...

随机推荐

  1. javascript闭包的理解和实例

    所谓闭包,值得是词法表示包括不必要计算的变量的函数,也就是说,该函数可以使用函数外定义的变量. 顺便提示一下: 词法作用域:变量的作用域是在定义时决定而不是执行时决定,也就是说词法作用域取决于源码,通 ...

  2. vue学习指南:第十二篇(详细) - Vue的 路由 第二篇 ( 路由按需加载(懒加载))

    各位朋友 因 最近工作繁忙,小编停更了一段时间,快过年了,小编祝愿 大家 事业有成 学业有成 快乐健康 2020开心过好每一天.从今天开始 我会抽时间把 Vue 的知识点补充完整,以及后期会带给大家更 ...

  3. 顶级Kagglers的心得和技巧

    这是一篇笔记,课程来自Coursera上的How to Win a Data Science Competition: Learn from Top Kagglers 本篇可以算是顶级Kaggler大 ...

  4. 基本程序单元Activity

    Activity的4种状态,运行状态,暂停状态,停止状态,销毁状态,下面就是生命周期的顺序图 手动创建Activity 1.创建继承自Activity的Activity 2.重写需要的回调方法 3.设 ...

  5. cookies、sessionStorage和localStorage的异同点

    相同点:都是存储于客户端 不同点: 1.存储大小 cookies数据大小不能大于4k; localStorage和sessionStroage则可以达到5M: 2.有效时间 cookies在设置的有效 ...

  6. LitElement(二)模板编写基本语法

    原文:https://lit-element.polymer-project.org/guide/templates 1.定义一个渲染模板 1.1 基本规则 要用LitElement 组件定义一个模板 ...

  7. 九、c++容器

    9.1 简介 容器库是类模板与算法的汇集,允许程序员简单地访问常见数据结构,例如队列.链表和栈. 有三类容器--顺序容器.关联容器和无序关联容器--每种都被设计为支持不同组的操作. 顺序容器:顺序容器 ...

  8. util之Set

    1.定义: Set<Integer>set = new TreeSet<Integer>(); 注意: TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不 ...

  9. Mongo查询list数组中一个字段大于特定条数

    由于刚刚接触mongodb,很多语法还不是很了解,写的不好的地方请大佬指出 查询的demo数据 { "_id":Object("xxxxxxxx"), &quo ...

  10. hadoop学习笔记(九):mr2HA高可用环境搭建及处步使用

    本文原创,如需转载,请注明原文链接和作者 所用到的命令的总结: yarn:启动start-yarn.sh   停止stop-yarn.sh zk :zkServer.start ;:zkServer. ...