C++的Enum hack
从一个例子开始吧
class Game {
private:
    static const int GameTurn = 10;
    int scores[GameTurn];
};
对于支持类内初始化的C++编译器,这段代码可以编译通过。
但是较老的C++编译器,可能不支持类内初始化,这样我们的静态常量,必须要在类外初始化。如下:
class Game {
private:
    static const int GameTurn;
    int scores[GameTurn];
};
const int Game::GameTurn = 10;
如果没有int scores[GameTurn];,这段代码就可以用不支持类内初始化的编译器通过了。
但因为 int scores[GameTurn]; 用到了GameTurn,而GameTurn的值不能确定。所以会报如下错误。
enum_hack.cpp:5: error: array bound is not an integer constant
这种情况下,如果我们仍然不想用硬编码的数字指定数组的大小,就可以考虑这篇文章的主角: enum hack 了。
使用enum hack的技巧,其思想就是把GameTurn定义为一个枚举常量。上面的代码可以写为:
class Game {
private:
    // static const int GameTurn;
    enum {GameTurn = 10};
    int scores[GameTurn];
};
// const int Game::GameTurn = 10;
这样代码就可以编译通过了。
《Effective C++》中这样描述enum hack的好处:
- enum hack的行为更像- #define而不是- const,如果你不希望别人得到你的常量成员的指针或引用,你可以用- enum hack替代之。(为什么不直接用- #define呢?首先,因为- #define是字符串替换,所以不利于程序调试。其次,- #define的可视范围难以控制,比如你怎么让- #define定义的常量只在一个类内可见呢?除非你用丑陋的- #undef。
- 使用 - enum hack不会导致 “不必要的内存分配”。
- enum hack是模板元编程的一项基本技术,大量的代码在使用它。当你看到它时,你要认识它。
不知道我的理解是否有误,欢迎讨论。
C++的Enum hack的更多相关文章
- enum hack
		关于占用内存的大小,enum类型本身是不占内存的,编译器直接替换.但是enum类型的变量肯定是占内存的. class A{ public: //enum类型本身不占内存 enumEnumTest{ a ... 
- C++ 笔记(一) —— 尽量以 const、enum、inline 替换 #define
		ilocker:关注 Android 安全(新手) QQ: 2597294287 #define ASPECT_RATIO 1.653 记号 ASPECT_RATIO 不会进入 symbol tabl ... 
- Effective C++ 之 Item 2:尽量以 const, enum, inline 替换 #define
		Effective C++ Chapter 1. 让自己习惯C++(Accustoming Yourself to C++) Item 2. 尽量以 const, enum, inline 替换 #d ... 
- 尽量多的以 const/enum/inline 替代 #define
		前言 在面向过程语言,如 C 语言中,#define 非常常见,也确实好用,值得提倡.但在如今面向对象的语言,如 C++ 语言中,#define 就要尽量少用了. 为何在 C++ 中就要少用了呢? 这 ... 
- NO.2: 尽量以const,enum,inline 替换 #define
		1.首先#define 定义不重视作用域(scope),虽然可以#undef控制,但是不美观,还存在多次替换的问题,以及没有任何封装性. 2.const XXX_XX,保证其常量性以及可控的作用域,如 ... 
- 尽量用const,enum,inline代替define
		在读<Effective C++>之前,我确实不知道const,enum,inline会和define扯上什么关系,看完感觉收获很大,记录之. define: 宏定义. 在编译预处理时,对 ... 
- Effective C++ 条款02:尽量以const,enum,inline替换 #define
		换一种说法就是宁可以编译器替换预处理器 举例 #define ASPECT_RATIO 1.653 记号ASPECT_RATIO也许从未被编译器看见:也许在编译起开始处理源码前它就被预处理器移走了,于 ... 
- 第一篇:尽量多的以 const/enum/inline 替代 #define
		前言 在面向过程语言,如 C 语言中,#define 非常常见,也确实好用,值得提倡.但在如今面向对象的语言,如 C++ 语言中,#define 就要尽量少用了. 为何在 C++ 中就要少用了呢? 这 ... 
- 【Effective C++ 读书笔记】条款02: 尽量以 const, enum, inline 替换 #define
		条款02: 尽量以 const, enum, inline 替换 #define 这个条款或许可以改为“宁可以编译器替换预处理器”. 编译过程: .c文件--预处理-->.i文件--编译--&g ... 
随机推荐
- Ubuntu Google Chrome
			Chrome安装 添加下载源 sudo wget http://www.linuxidc.com/files/repo/google-chrome.list -P /etc/apt/sources.l ... 
- 容器flappybird游戏——图文操作指引贴
			第一步:打开华为云容器引擎产品首页,点击免费体验馆 第二步:进入免费体验馆,点击体验按钮,获得3天免费集群 第三步:创建免费集群完成后,进入产品console页,如图所示: 第四步:如 ... 
- Android与Unity相互调用
			1. 在Unity里调用Android代码: void OnGUI(){ AndroidJavaClass jc = new AndroidJavaClass("com.some.packa ... 
- beta5
			吴晓晖(组长) 过去两天完成了哪些任务 完善推荐算法 展示GitHub当日代码/文档签入记录 接下来的计划 推荐算法 还剩下哪些任务 组员:刘帅珍 过去两天完成了哪些任务: 修改原型,整理背景 明日计 ... 
- 读C#程序(第三周)
			阅读下面程序,请回答如下问题: 问题1:这个程序要找的是符合什么条件的数? 问题2:这样的数存在么?符合这一条件的最小的数是什么? 问题3:在电脑上运行这一程序,你估计多长时间才能输出第一个结果?时间 ... 
- ElasticSearch 2 (27) - 信息聚合系列之故事开始
			ElasticSearch 2 (27) - 信息聚合系列之故事开始 摘要 到目前为止,本书都在着重介绍搜索.对于搜索,我们有查询条件以及与查找到与条件匹配的集合.这个过程就和如大海捞针一样. 对于聚 ... 
- Software-Defined Networking:A Comprehensive Survey--Day3
			(接Day2的内容 +2s) E. Layer V: Northbound Interfaces 南行接口已经得到广泛接受(OpenFlow),但现在就定义北向接口还为时尚早,开发不同的控制器经验一定 ... 
- String  js删除字符串的最后一个字符三种方法
			字符串 var basic = "abc,def,ghi,"; 第一种 basic = basic.substr(0, basic.length - 1); 第二种 basic = ... 
- java之常量折叠
			为什么会写着篇博客,因为昨天看了关于final关键字的解析.但是有个问题始终没有得到解决,于是请教了我qq上之前添加的知乎大神.他给我回复的第一条消息:常量折叠.身为渣渣猿的我立马查询了这个概念.这是 ... 
- SSR & Next.js & Nuxt.js
			SSR & Next.js & Nuxt.js Server Side Rendering https://nextjs.org/ https://nuxtjs.org/ SSR &a ... 
