从一个例子开始吧

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的好处:

  1. enum hack的行为更像#define而不是const,如果你不希望别人得到你的常量成员的指针或引用,你可以用enum hack替代之。(为什么不直接用#define呢?首先,因为#define是字符串替换,所以不利于程序调试。其次,#define的可视范围难以控制,比如你怎么让#define定义的常量只在一个类内可见呢?除非你用丑陋的#undef

  2. 使用enum hack不会导致 “不必要的内存分配”。

  3. enum hack是模板元编程的一项基本技术,大量的代码在使用它。当你看到它时,你要认识它。

不知道我的理解是否有误,欢迎讨论。

最新文章

  1. serviceStack.Redis 在PooledRedisClientManager 中设置密码
  2. DDD~Unity在DDD中的使用
  3. opencv实现KNN手写数字的识别
  4. POJ 2362 Square
  5. 添加EF上下文对象,添加接口、实现类以及无处不在的依赖注入(DI)
  6. MVC UnitOfWork EntityFramework架构
  7. Tomcat之URL查找的过程
  8. Luogu P1596 [USACO10OCT]湖计数Lake Counting
  9. [LeetCode] Binary Tree Longest Consecutive Sequence II 二叉树最长连续序列之二
  10. 海量信息库,查找是否存在(bloom filter布隆过滤器)
  11. Lua教程
  12. [Swift]LeetCode423. 从英文中重建数字 | Reconstruct Original Digits from English
  13. ogg同步DDL时,源和目标端表空间名称不同的解决思路
  14. Tomcat的九个内置对象
  15. React 记录(2)
  16. jetty去掉项目名称访问
  17. Github最简单实用的Git命令指南
  18. Memory barrier 简介
  19. idea 开发插件。
  20. HDU 1421 搬寝室(经典DP,值得经常回顾)

热门文章

  1. 172. Remove Element【LintCode by java】
  2. 金蝶K3 11.0 WISE版本盘点机PDA条码数据采集器仓库条码管理
  3. EOS开发基础之五:使用cleos命令行客户端操作EOS——智能合约之Exchange
  4. PAT甲题题解-1004. Counting Leaves (30)-统计每层叶子节点个数+dfs
  5. C#程序解读
  6. button 和 submit 的区别
  7. letsencrypt续期 最简单的续期方法更新证书
  8. 一本通1635【例 5】Strange Way to Express Integers
  9. POJ 2584 T-Shirt Gumbo
  10. 前端学习 -- Css -- 浮动