C++11快餐教程(1)-通过using定义类型的别名

C++11快餐教程(1)-通过using定义类型的别名

在C/C++中,我们经常通过typedef来定义类型的别名。

例如:

typedef unsigned char u1;
typedef unsigned short u2;

但是,这样定义有一点不好,新定义的别名是放在后面的。一般我们都是通过别名找原名,从后往前找还是不方便的。
那么,我们把别名定义在前面好不好?

using u4 = uint32_t;
using u8 = uint64_t;

在C++11中,using不再只是用于using namespace啦,从此在别名领域大显身手。

using用来定义别名,特别适用于在模板的情况下:
下面的例子来源于ART中的容器类型的定义:

template <typename T>
using ArenaDeque = std::deque<T, ArenaAllocatorAdapter<T>>;

template <typename T>
using ArenaQueue = std::queue<T, ArenaDeque<T>>;

template <typename T>
using ArenaVector = std::vector<T, ArenaAllocatorAdapter<T>>;

template <typename T, typename Comparator = std::less<T>>
using ArenaSet = std::set<T, Comparator, ArenaAllocatorAdapter<T>>;

template <typename K, typename V, typename Comparator = std::less<K>>
using ArenaSafeMap =
    SafeMap<K, V, Comparator, ArenaAllocatorAdapter<std::pair<const K, V>>>;

有了上面的定义之后,我们的封装后的类型就可以泛型使用了:

ArenaVector<MIRLocation> method_stack_;        // Include stack

这是typedef无法实现的哦。

小结一下:

  • C++11中的using关键字可以实现typedef的功能,而using的定义顺序有利于查找
  • using在模板类型的别名定义比typedef要有效
时间: 2024-08-03 14:12:41

C++11快餐教程(1)-通过using定义类型的别名的相关文章

C++11时代的标准库快餐教程(1) - 不同类型值组成的简单列表

不同类型值组成的简单列表 - pair和tuple 值对儿,就是由两个或以上的不同类型的值,组成的简单列表结构.强调不同类型,是因为同类型用数组不就是了么. 最简单的值对,是只有两个值的对儿,这种结构叫做std::pair. 两个值结对儿-std::pair 这种简单的结构有什么用呢?答案就在于简单. 我们有很多种情况下,需要的就是简单. 1. key-value组合: 比如我们要在真正的容器里放键-值对(key-value),这是一个再普通不过的需求了.这时肯定犯不上为每一种这样的组合写一个新

C++11时代的标准库快餐教程(3) - 排序

排序 讲完容器之后,我们迅速进入到算法部分. 首先看一下,我们这讲在整个算法大图的中位置: 在进入排序相关之前,我们把虽然与排序无关,但是也有关联的计数和最大值最小值部分先看一下.算是对算法部分作个预热,将来会广泛出场的lambda表达式也先借机会亮亮相. 计数 计数的目的,是数一数,在容器里,符合某一条件的元素有多少个. 算法1: std::count,数一数跟这个值相等的对象有多少个. 我们看一个例子,数数vector中有几个1: std::vector<int> bit_containe

TypeScript快餐教程 (1) - 初识

TypeScript快餐教程 (1) - 初识 JavaScript,更广泛点也许可以说是ECMA Script的各种实现,从诞生到现在,一直就没断过争议.ECMA Script 4的夭折正是这些争论严重程度的重要体现. Anyway,不断争议如何,JavaScript的地位一直不曾被撼动.针对JavaScript存在的问题,可编译成JavaScript的语言一直就前仆后继. 这其中,DART,CoffeeScript和TypeScript是其中最有名的三个. DART由Google推出,设计者

Clojure快餐教程(1) - 运行在JVM上的Lisp方言

Clojure快餐教程(1) - 运行在JVM上的Lisp方言 Java作为目前为止被使用最广泛的使用虚拟机的编程语言,带动了JVM上语言族的繁荣. 有根红苗正的为JVM设计的动态语言Groovy,目前最主要被用于Gradle编译环境中:也有Jython, JRuby等动态语言在JVM上的实现,也有scala这样强大的混合语言. 在这之中,clojure是比较特殊的一种,它是Lisp语言在JVM上的一种方言. 使用clojure调用java 首先我们先看一下如何用clojure来调用java的方

Android Studio的JNI开发快餐教程

Android Studio的JNI开发快餐教程 从eclipse换到Android Studio之后,原来的NDK集成已经不能用了.同时,AndroidStudio也是在快速迭代进步中,不仅支持内置的ndk支持插件,还有支持外部编译系统的plugin. 而且这还是在实验中的结果,在不久的将来,还可能有更新的变化.不过,万变不离其宗,我们打好基础,形式上的东西跟着Android Studio变就好. 旧式的NDK支持 首先说明,既然是Android Studio认为它已经过时了,所以我们需要在g

用代码画流程图和时序图快餐教程(3) - PlantUML画时序图

PlantUML画时序图 用描述性的语言来写UML,尤其是Sequence Diagram,PlantUML应该是很多同学的首选了吧. 网址:http://plantuml.com/ 我们可以使用eclipse的plugin来写PlantUML,如下: 速成教程 @startuml和@enduml 这个没啥说的,开始的时候用@startuml,结束的时候要加个@enduml. 标题 格式: title 标题名 participant 格式:participant 类名 #颜色 例: @start

用代码画流程图和时序图快餐教程(1) - graphviz的dot图

用代码画流程图和时序图快餐教程(1) 版本历史: 2016.06.02,v1:初稿 2016.07.31,v2:更新中文字体的设置.更新颜色的作用. 2017.08.02,v3:更新命令行方式 graphviz的dot图 工具下载网址:http://www.graphviz.org/. 可以使用sublime text来编辑. Windows下的GVEdit 在Windows下,Graphviz提供一个GVedit工具来编辑. 命令行方式 在mac和Linux下,我们可以采用命令行的方式来实现.

ART世界探险(3) - ARM 64位CPU的架构快餐教程

ART世界探险(3) - ARM 64位CPU的架构快餐教程 前面我们说过,Dalvik如果没有JIT的话,可以做到架构无关,让Dalvik指令都解释执行.但是ART是AOT,要编译成针对芯片具体的机器指令. 所以,研究Dalvik的时候可以不用太关心目标指令,而我们研究ART必须对目前最流行的微处理器的架构有个基本的了解. 在上一讲我们对于ART从java byte code到ARM64 v8指令的整个流程有了一个大概的了解之后,我们就目前最流行的ARM64位芯片的知识进行一些探索. 我们的目

R语言快餐教程(1) - 我们开始做统计吧

R语言快餐教程(1) - 我们开始做统计吧 R语言简介 R语言是基于S语言的一种开源实现.S语言是贝尔实验室最早开发的一种用于统计的工具,后来成为商业的S-PLUS软件,是一种与SAS和SPSS齐名的统计软件. R语言的官方网址是:[https://www.r-project.org/] R语言的一个重要的优势就是R的生态,有大量的高质量的第三方的统计和算法相关的包. 在R中活下去 获取帮助 首先我们学习如何在R中获取函数帮助和函数的例子. help(函数名) 例:比如我们想知道标准差函数sd的