C++11 新特性:模板别名

2023-11-19

C++11 新特性:模板别名

 豆子   2012年5月22日   C++   没有评论

参考文章:https://blogs.oracle.com/pcarlini/entry/template_aliases

2002 年,ISO C++ 标准化组织就已经提出了模板别名的概念。不过那时候还是叫做 typedef template。在接下来的几年中,以 Gabriel Dos Reis 和 Bjarne Stroustrup 为代表的开发者发展了这个想法,最终,我们在 C++ 11 中见到了这个新特性—— template aliases。

不过,只有在最新版本的 GCC 实现中才能使用这个特性(4.7 或更新版本)。但这并不是说这个特性很难实现——其实它是很容易实现的,对容器和内存管理函数这样的库尤其有用。可能只是开发者忘记在之前的版本中添加上这个功能 ;-P。

这个特性的核心功能很简单:提供类型族的别名。注意,这里并没有引入新的关键字,而是使用旧的using 关键字,加上新的语法组成。例如:

C++
1
2
3
4
5
6
7
#include <vector>
 
template < class T > struct Alloc { /* ... */ } ;
template < class T >
using Vec = std :: vector < T , Alloc < T >> ;
 
Vec < int > v ; // 等价于 std::vector<int, Alloc<int>> v;

我们为所有可能的 T 类型的std::vector<T, Alloc<T>>声明了一个名字 Vec。这样,这个模板的别名就可以用作其它类型,只要直接加上 T 的实际类型就可以了。

我们可以写出更复杂的示例,但是语法还是一样的。把复杂的代码变得简单总是看起来很有趣的(对此而言,旧版本的 C++ 也有一些简化的写法)。如果对此感兴趣,那么就看看下面的代码吧:

C++
1
2
3
4
5
6
7
8
9
10
template < typename T >
class allocator
{
     //...
 
     template < typename U >
     struct rebind { typedef allocator < U > other ; } ;
} ;
 
allocator < T > :: rebind < U > :: other x ;

我们用 C++ 11 的模板别名重写一下:

C++
1
2
3
4
5
6
7
8
9
10
template < typename T >
class allocator
{
     //...
 
     template < typename U >
     using rebind = allocator < U > ;
} ;
 
allocator < T > :: rebind < U > x ;

事实上,在 C++ 11 的内存分配库、智能指针库以及其它各种库中,有很多类似 rebind 这样的模板别名。我们可以从 GCC 最新版本的代码中看到这些别名的用例。

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

C++11 新特性:模板别名 的相关文章

  • 一些个人常用的网站网址

    一些个人常用的网站网址 GitHub https github com Gitee https gitee com 1 书栈网 https www bookstack cn explore cid 27 tab popular 2 Unit
  • cpu要和gpu搭配吗_显卡和CPU可以随便搭配吗?

    从理论上来说 CPU和GPU是可以随意搭配 没有什么限制 只要主板支持就可以了 但是在实际操作的时候 你会发现事情没有那么简单 办公的时候 一块双核四线程的速龙200EG就可以满足 自带的核显也可以点亮电脑 那么我们就没有必要在插上一块独显
  • sparkstreamming 消费kafka(1)

    pom
  • fastdfs-client使用教程

    FastDfs客户端使用文档 fastdfs client支持框架 fastdfs client目前支持的框架有springboot1 x springboot2 x springmvc 添加fastdfs client依赖 springb
  • UnitBox:一种先进的目标检测网络

    UnitBox 一种先进的目标检测网络 摘要 1 简介 2 IOU损耗层 2 1 L2损失层 2 2 IoU损耗层 正向 2 3 IoU损耗层 向后 3 单元箱网络 4 实验 4 1 IoU损失的有效性 4 2单元箱性能 5 结论 原文 U
  • 网站开发之HTML基础知识及超链接(二)

    前面的文章我讲述了HTML的基础知识 包括 1 JSP前段设计及HTML基础介绍 2 HTML常用标记符 HEAD HTML属性 BODY设置背景 注释 FONT B I U 3 HTML设置段落格式 分段P 换行BR 标题样式Hn HR
  • Element Dialog水平垂直居中样式

    前言 Element UI 是目前最火的前端Vue js UI组件库 但是Dialog默认样式并不是水平垂直居中 这就很让人很尴尬 不过对于有水平垂直居中的需求来说 我们是可以自己进行调整的 最常用的方法也试过了 最终得到以下方法是最佳的
  • 关于C++函数返回值的使用方式以及局部对象何时析构的问题

    关于C 局部对象何时析构的探讨 我之前一直笼统的认为局部在函数调用结束之后 所有的局部变量会立刻析构 经过仔细分析之后才发现还有很多细节 这里对比了函数返回值的使用 Test t t fun 赋值 和 Test t fun 初始化 假设有一

随机推荐

  • html5 实现坦克大战,HTML5实现坦克大战(一)

    方法 MoveUp 坦克上移 MoveDown 坦克下移 MoveRight 坦克右移 MoveLeft 坦克左移 MyTank extends Tank EnemeyTank extends Tank Bullet Tank 字段 x y
  • 2023最新骚扰电话查询接口

    一 原始方法注入数据 初始化方法 constructor token this token Z1QljZOZiT4NTG 请求地址 this req url http api txapi cn v1 c nuisance calls que
  • Redis系列二

    1 4 Redis基础知识 1 4 1 默认数据库 Redis默认数据库数量有16个 redis conf配置文件可查看 默认使用的数据库为0 1 4 2 切换数据库 使用select 命令进行切换 root yunmx bin redis
  • C++ 信号处理

    信号是由操作系统传给进程的中断 会提早终止一个程序 在 UNIX LINUX Mac OS X 或 Windows 系统上 可以通过按 Ctrl C 产生中断 有些信号不能被程序捕获 但是下表所列信号可以在程序中捕获 并可以基于信号采取适当
  • ytb网站报错 “您没有联网,请检查网络连接”

    问题原因 解决办法 计算机时间有问题 在设置中 同步 时间 并且关闭路由器的Ipv6以绝后患 xxxxxxx com core proxy vmess encoding failed to read response header gt w
  • Matlab与VC混合编程之一

    Matlab与VC混合编程之一 1 问题的提出 为什么需要用Matlab与VC混合编程 做工程项目时用的是VC 经常会用到科学计算的相关算法 比如矩阵求逆 求行列式 求微分方程组初值问题的数值解等问题 如果自己去编写相关的函数 首先需要去找
  • windows线程调度、线程优先级和亲缘性

    windows线程调度 线程优先级和亲缘性 每一个线程在它的线程内核对象中有一个上下文结构 反映了线程最后一次执行的 CPU 寄存器状态 每隔大约 20ms 可以使用 GetSystemTimeAdjustment 获得 我测得这个间隔大约
  • android调节系统音量之修改默认音量、最大音量和最小音量

    Android系统拥有多种声音属性 包括有多媒体 通话 通知等声音属性 这些声音属性分别含有自己默认音量 最大音量和最小音量属性 下面我将介绍一下这些声音属性的音量定义和它们的修改方式 默认音量 系统声音的默认音量定义在 framework
  • ZCMU--2219: Toy Army(C语言)

    The hero of our story Valera and his best friend Arcady are still in school and therefore they spend all the free time p
  • SpringBoot 接受文件和对象

    SpringBoot 接受文件和对象 使用场景 某个接口 需要同时接受文件和实体 也就是参数 一 这个时候 前端就不能 json 格式传送数据了 要用到 multipart form data 这种格式传送数据 二 那么 这个时候 后端应该
  • Java抛出自定义异常,报java.lang.reflect.UndeclaredThrowableException: null的错误

    最近项目中使用了自定义异常 并做了全局异常处理 抛出异常的代码如下 throw new FebsException 系统管理员不能修改颜色 结果运行后 报java lang reflect UndeclaredThrowableExcept
  • 前端开发时常用的第三方工具库

    前端开发时常用的第三方工具库 JavaScript 实用工具库 一 lodash 1 官方文档 中文文档 https www lodashjs com 2 简介及使用场景 Lodash 是一个一致性 模块化 高性能的 JavaScript
  • windows sqlite可视化工具sqlitestudio下载、安装、使用

    1 下载地址 https sqlitestudio pl index rvt 2 使用 选择数据库 gt 添加数据库 gt 选择你的本地数据库 并点击 增加就可以查看数据库了
  • 浅谈Buffer

    什么是Buffer 在 Node js 中 Buffer 类是随 Node 内核一起发布的核心库 Buffer 库为 Node js 带来了一种存储原始数据的方法 可以让 Node js 处理二进制数据 global Buffer gt f
  • 爬虫小白也能玩转!Python爬虫中的异常处理与网络请求优化

    大家好 我是来自爬虫世界的小编 今天 我要和大家分享一些关于Python爬虫中的异常处理和网络请求优化的经验 不论你是初学者还是有一定经验的爬虫程序员 我相信这些实用的技巧和代码示例都能为你在爬取数据的过程中带来方便和效率 1 异常处理 保
  • MySQL查看、创建和删除索引的方法分享

    这篇文章主要介绍了MySQL查看 创建和删除索引的方法 结合实例形式较为详细的分析了MySQL中索引的作用 以及查看 创建及删除索引的相关实现技巧 具有一定参考借鉴价值 需要的朋友可以参考下 本文实例讲述了MySQL查看 创建和删除索引的方
  • STM32系统时钟超详解

    作者简介 嵌入式入坑者 与大家一起加油 希望文章能够帮助各位 个人主页 rivencode的个人主页 系列专栏 玩转STM32 保持学习 保持热爱 认真分享 一起进步 目录 一 什么是时钟 二 时钟树 1 HSE时钟 2 HSI时钟 3 L
  • Shell变量的设置规则

    1 变量设置规则 变量与变量内容以一个等号 myname LSX 等号两边不能直接接空格 myname LSX 或 myname L SX 都是错误 变量名称只能是英文字母与数字 但是开头字符不能是数字 2myname LSX 错误 2 双
  • 华为od机考真题-数据分类

    while 1 try c b nums list map int input split dp
  • C++11 新特性:模板别名

    C 11 新特性 模板别名 豆子 2012年5月22日 C 没有评论 参考文章 https blogs oracle com pcarlini entry template aliases 2002 年 ISO C 标准化组织就已经提出了模