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是模板元編程的一項基本技術,大量的代碼在使用它。當你看到它時,你要認識它。

不知道我的理解是否有誤,歡迎討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章