文档章节

C++的Enum hack

geek_loser
 geek_loser
发布于 2016/11/14 12:42
字数 447
阅读 17
收藏 0

从一个例子开始吧

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是模板元编程的一项基本技术,大量的代码在使用它。当你看到它时,你要认识它。

本文转载自:http://www.cnblogs.com/jiqingwu/p/cpp_enum_hack.html

geek_loser
粉丝 3
博文 74
码字总数 18849
作品 0
朝阳
私信 提问
C与C++对于全局变量的不同处理之处

下面看看我犯的错误: 当时写了一个类似于下面的枚举: #ifndef TESTENUMH_ #define TESTENUMH_ enum { TESTFLAG1E, TESTFLAG2E, TESTFLAGNR } TEST_E; #endif 当时在enum关键字前面遗漏了“...

十分爱
2012/01/22
0
1
在C#中派生C++的抽象类

目前看到了几种选择: SWIG 这个叫做"director"的机制不是真正的派生, 只是看起来像而已 C#里的类只是包装了一个C++对象的指针, 所有调用都是通过P/Invoke完成的, 实际上是两个不同的对象 CX...

长平狐
2012/11/12
131
0
利用 C++ Interop 封装 ISO C++ 对象, 供其他 .Net 语言使用

.Net BCL 支持两种互操作技术,模块 级重用 P/Invoke 和组件级重用COM 互操作, C++/CLI 除了支持以上两种互操作以外,更支持代码级重用, 称为 C++ Interop,本文 仅举例说明这种互操作技术。...

Yong_Luo
2010/10/01
0
0
odb 1.4.0 发布,C++的ORM框架

该版本最主要的改进就是保护对 Qt 基本类型、日期时间类型、智能指针、容器等对象类型的支持,支持 C++ 枚举和 数据库 ENUM 类型。 ODB 是一个开源的,支持多平台,支持多数据库的 C++ 的 OR...

红薯
2011/04/27
441
0
C++ 中命名空间的 5 个常见用法

原文出处:CppDepend Team 译文出处:王江平 译者注:可能很多程序员对C++已经非常熟悉,但是对命名空间经常使用到的地方还不是很明白,这篇文章就针对命名空间这一块做了一个叙述。 命名空间...

CppDepend Team
2017/06/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一个简单易用的Linux文本编辑器:nano的安装与使用

许多状况下咱们都必要编纂云主机里的文本情节,而现时用的比力多的文本编纂器是vim,这个估量许多人都以为很难用,这边伏笔VPS引荐一个简略易用的文本编纂器nano,比vim简略许多,很轻易上手...

shzwork
35分钟前
3
0
go recover

异常、错误常见语言处理 一般语言都有其错误处理方式,就以鄙人熟悉的php来距离吧。 PHP有多个级别的错误处理方式,以防止程序在还未正确执行完毕时,就造成了程序的提前结束。 try/catch/fi...

o0无忧亦无怖
53分钟前
1
0
玩转混合云+边缘计算,且看ZStack Mini!

文章导读:2019年4月16日,ZStack新品和合作伙伴战略发布会上,面向集团客户和边缘场景需求,ZStack重磅推出ZStack Mini超融合一体机(以下简称:ZStack Mini)和ZStack多云管理平台(以下简...

ZStack社区版
55分钟前
2
0
springboot 整合redis

springboot整合redis官方是有文档的: 英文看不懂可以翻译,代码应该看得懂, 这个是自动注入的。当然也可以xml注入,手动配置。 整合步骤: pom文件: <!-- spring boot web --> ...

jason_kiss
58分钟前
3
0
手机耗电问题,大部分是没有正确使用这个“锁”

当安卓设备闲置时,设备很快会进入休眠状态,以达到省电和减少CPU占用的目的。但有些应用在手机灭屏甚至系统休眠时,依然频繁占用CPU处理事件或唤醒屏幕提示用户消息,这类行为会导致手机耗电...

安卓绿色联盟
59分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部