日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++的enum hack

發布時間:2023/12/4 c/c++ 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的好處:

  • enum hack的行為更像#define而不是const,如果你不希望別人得到你的常量成員的指針或引用,你可以用enum hack替代之。(為什么不直接用#define呢?首先,因為#define是字符串替換,所以不利于程序調試。其次,#define的可視范圍難以控制,比如你怎么讓#define定義的常量只在一個類內可見呢?除非你用丑陋的#undef。

  • 使用enum hack不會導致 “不必要的內存分配”。

  • enum hack是模板元編程的一項基本技術,大量的代碼在使用它。當你看到它時,你要認識它。

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

    總結

    以上是生活随笔為你收集整理的C++的enum hack的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。