C++的Enum hack
2024-09-15 22:36:29
从一个例子开始吧
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
是模板元编程的一项基本技术,大量的代码在使用它。当你看到它时,你要认识它。
不知道我的理解是否有误,欢迎讨论。
最新文章
- serviceStack.Redis 在PooledRedisClientManager 中设置密码
- DDD~Unity在DDD中的使用
- opencv实现KNN手写数字的识别
- POJ 2362 Square
- 添加EF上下文对象,添加接口、实现类以及无处不在的依赖注入(DI)
- MVC UnitOfWork EntityFramework架构
- Tomcat之URL查找的过程
- Luogu P1596 [USACO10OCT]湖计数Lake Counting
- [LeetCode] Binary Tree Longest Consecutive Sequence II 二叉树最长连续序列之二
- 海量信息库,查找是否存在(bloom filter布隆过滤器)
- Lua教程
- [Swift]LeetCode423. 从英文中重建数字 | Reconstruct Original Digits from English
- ogg同步DDL时,源和目标端表空间名称不同的解决思路
- Tomcat的九个内置对象
- React 记录(2)
- jetty去掉项目名称访问
- Github最简单实用的Git命令指南
- Memory barrier 简介
- idea 开发插件。
- HDU 1421 搬寝室(经典DP,值得经常回顾)
热门文章
- 172. Remove Element【LintCode by java】
- 金蝶K3 11.0 WISE版本盘点机PDA条码数据采集器仓库条码管理
- EOS开发基础之五:使用cleos命令行客户端操作EOS——智能合约之Exchange
- PAT甲题题解-1004. Counting Leaves (30)-统计每层叶子节点个数+dfs
- C#程序解读
- button 和 submit 的区别
- letsencrypt续期 最简单的续期方法更新证书
- 一本通1635【例 5】Strange Way to Express Integers
- POJ 2584 T-Shirt Gumbo
- 前端学习 -- Css -- 浮动