从一个例子开始吧
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
是模板元编程的一项基本技术,大量的代码在使用它。当你看到它时,你要认识它。
不知道我的理解是否有误,欢迎讨论。