转载

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

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

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

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

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

正文到此结束
Loading...