C++默认模板自变量(Default Template Arguments)

2023-10-27

一、类模板的默认模板自变量

我们可以对 class templates 定义其 template parameters 的默认值,这称为 default template arguments(默认模板自变量)。默认模板自变量值甚至可以引用前一步声明的 template parameters。例如在 class Stack<> 中,你可以把容器类型定义为第二个template parameter,并使用std::vector<> 作为其默认值:
 

#include <vector>
#include <stdexcept>

template <typename T, typename CONT = std::vector<T> >
class Stack {
private:
	CONT elems; // 元素
public:
	void push(T const&); // push 元素
	void pop(); // pop 元素
	T top() const; // 传回 stack 的顶端元素26
	bool empty() const { // stack 是否为空
		return elems.empty();
	}
};

template <typename T, typename CONT>
void Stack<T, CONT>::push(T const& elem)
{
	elems.push_back(elem); // 追加元素
}

template <typename T, typename CONT>
void Stack<T, CONT>::pop()
{
	if (elems.empty()) {
		throw std::out_of_range("Stack<>::pop(): empty stack");
	}
	elems.pop_back(); // 移除最后一个元素
}

template <typename T, typename CONT>
T Stack<T, CONT>::top() const
{
	if (elems.empty()) {
		throw std::out_of_range("Stack<>::top(): empty stack");
	}
	return elems.back(); // 传回最后一个元素的拷贝
}

 

从上面代码可以看到,由于模板如今有两个参数,所以stack类的每一个成员函数的定义式中都必须包含这两个参数:
 

template <typename T, typename CONT>
void Stack<T,CONT>::push (T const& elem)
{
elems.push_back(elem); // 追加元素
}

使用

int main()
{
	try {
		// stack of ints
		Stack<int> intStack;

		// stack of doubles,其内部使用 std::deque<> 来管理元素
		Stack<double, std::deque<double> > dblStack;
		//译注:千万不要声明为 Stack<double, std::deque<int> >,
		// 这是自己砸自己的脚,编译器无法为你做些什么。
	
		intStack.push(7);
		std::cout << intStack.top() << std::endl;

		// 操控 double stack
		dblStack.push(42.42);
		std::cout << dblStack.top() << std::endl;		

	}
	catch (std::exception const& ex) {
		std::cerr << "Exception: " << ex.what() << std::endl;
		return EXIT_FAILURE; // 以错误状态码离开程序
	}
}

二、函数模板的默认模板自变量

函数模板的默认自变量也类似

template <typename T, typename F = std::less<T>>
int compare(const T &v1, const T &v2, F f = F())
{
        if (f(v1, v2)) return -1; 
        if (f(v2, v1)) return 1;
        return 0;
}

int main()
{
        std::cout << compare(1, 2) << std::endl;

        return 0;
}

 

参考:https://blog.csdn.net/love1937/article/details/50344817

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++默认模板自变量(Default Template Arguments) 的相关文章

  • UTF8/UTF16 和 Base64 在编码方面有什么区别

    In c 我们可以使用下面的类来进行编码 System Text Encoding UTF8 System Text Encoding UTF16 System Text Encoding ASCII 为什么没有System Text En
  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new

随机推荐

  • 目标检测YOLO实战应用案例100讲-智能目标检测系统在FPGA中的设计与实现

    目录 基于FPGA的目标检测系统的设计与实现 深度学习硬件加速技术研究现状 相关理论与技术概述
  • Parent name: cv2.cv2. Submodule name: cv2

    Bindings generation error Submodule name should always start with a parent module name Parent name cv2 cv2 Submodule nam
  • js ajax 传输list,jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签...

    废话不多说了 直接给大家贴代码了 具体内容如下所示 js function myBtn f var cnt myCnt val syncAjax myAjax html cnt cnt function result if 100 resu
  • sklearn中digits手写字体数据集介绍

    1 导入 from sklearn import datasets digits datasets load digits 2 属性查看 digits bunch类型 print digits keys images data target
  • 【Docker实战】使用Docker部署Tomcat

    Docker实战 使用Docker部署Tomcat 一 Tomcat介绍 1 Tomcat简介 2 Tomcat特点 3 Tomcat容器部署的优点 4 Tomcat的配置文件 二 检查本地环境 三 检查本地Docker环境 1 检查本地D
  • VLAN虚拟局域网

    一 虚拟局域网 VLAN Virtual Local Area Network 定义 VLAN 是一种将局域网内的设备逻辑地划分成一个个网段从而实现虚拟工作组的技术 VLAN 能够隔离广播域 VLAN 内的主机之间可以直接通信 而 VLAN
  • “Argument list too long”解决方法

    1 背景 Linux下使用cp mv rm等命令时经常会碰到 Argument list too long 错误 这主要是因为这些命令的参数太长 即文件个数过多 2 解决方案 Argument list too long 这个问题的解决主要
  • 升压电路(BOOST)与降压电路(BUCK)

    一 电路中产生电流的条件是 1 电路里必须有电源供电 2 电路必须形成闭合回路 降压元器件 升降压电路构成的核心元器件 1 电感 储存能量 电感是无法突变的 工作状态是线性的 2 二极管 3 mos管 首先先分清楚mos是N mos还是P
  • 真题详解(归并)-软件设计(五十三)

    真题详解 UML部署图 软件设计 五十二 https blog csdn net ke1ying article details 130233656 语句覆盖 lt 判定覆盖 lt 条件覆盖 lt 路径覆盖 2 ISO IEC 9126软件
  • 互联网支付系统整体架构详解(转)

    https www cnblogs com zhjh256 p 6763978 html 在互联网产品运营中 有很多小伙伴或许会遇到这样的困扰 产品好不容易推出来了 流量成本节节攀升 用户的活跃度 留存度却持续下降 因此在瞬息万变的互联网产
  • tomcat和nginx的日志记录请求时间

    当系统卡顿时候 我们需要分析时间花费在哪个缓解 项目的后端接口可以记录一些时间 此外 在我们的tomcat容器和nginx网关上也可以记录一些有关请求用户 请求时间 响应时间的数据 可以提供更多的信息以便于排查问题 1 tomcat日志 s
  • 2022十四届蓝桥杯校赛题解(Python大学组)

    2022十四届蓝桥杯校赛题解 Python大学组 填空题 二进制2022 经历天数 考查datetime库 16进制数 优先动态规划 不同质数查找 编程题 拷贝问题 筛选重复单词 回文串 图形动态规划 交换代价问题 附录 常见方法 考试直接
  • Linux统计代码量命令cloc

    记录一下Linux中一个非常好用的代码量统计命令 cloc 安装步骤 sudo apt get install cloc 使用方法 进入到要统计的工程根目录 cloc 运行结果
  • 【以太坊源码】mpt实现

    转载自 click here trie encoding go encoding go主要处理trie树中的三种编码格式的相互转换的工作 三种编码格式分别为下面的三种编码格式 KEYBYTES encoding这种编码格式就是原生的key字
  • C语言字符串及其函数

    C语言中没有类似于C 或Java中的string类型 如果要在C中表示字符串 可用字符数组的形式 数组的概念可戳此链接了解 在C 中 string类库可以更简单的表示和使用字符串 可戳此链接了解string类 C语言中字符串是以空字符 0结
  • FRP中安全地暴露内网服务

    导读 之前的教程介绍的frp内网穿透都是用tcp模式 但是tcp模式是直接把端口映射到公网IP上 很容易被扫描爆破 还是存在一定的风险 我们可以使用frp提供的stcp模式来避免公开暴露端口 同时访问者也要运行一个frpc作为接收转发 fr
  • angular4中ngModel双向绑定在限制输入情况下与value值不一致的问题及尝试的解决方法

    近期公司的一个后台项目在使用angular4进行开发 随着项目的推进和迭代开发 需要对有的input框的value值进行限制输入 例如目前项目的一些input框只允许输入数字和 这两种形式的内容 就在input标签的中添加了 keyup 属
  • html中怎么引入外部css文件路径,怎么引入外部css文件样式?

    怎么引入外部css文件样式 来给html标记添加各种样式 下面本篇文章就来给大家介绍一下引入外部css文件样式的方法 希望对大家有所帮助 方法1 使用来引入外部的css文件 在网页的标签对中使用标记来引入外部样式表文件 使用html规则引入
  • ddl是什么意思网络语_ddl是什么意思(网络语ddl是什么梗)

    每文一言 潜能 我等皆具之资 01 DDL 其真身为deadline 又名死亡之线 常现于众学士之眼 或如任务上缴之日 排它念 存己欲 三刻之内便可将之 绳之以法 实乃天网恢恢 疏而不漏 亦如大考之时 废寝忘食 通宵达旦 以一目十行之势 饱
  • C++默认模板自变量(Default Template Arguments)

    一 类模板的默认模板自变量 我们可以对 class templates 定义其 template parameters 的默认值 这称为 default template arguments 默认模板自变量 默认模板自变量值甚至可以引用前一