從一個例子開始吧
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
是模板元編程的一項基本技術,大量的代碼在使用它。當你看到它時,你要認識它。
不知道我的理解是否有誤,歡迎討論。
Effective C++ 中文版第三版 高清PDF http://www.linuxidc.com/Linux/2012-08/67301.htm