從一個例子開始吧編程
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
了。code
使用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
是模板元編程的一項基本技術,大量的代碼在使用它。當你看到它時,你要認識它。
不知道個人理解是否有誤,歡迎討論。