c++14 獲取枚舉名

c++14 獲取枚舉名

前言

之前寫過一篇c++11 獲取枚舉名,這裏使用c++14 進行重構。c++14 放鬆了對 constexpr 函數的限制,因此可以將解析枚舉名的步驟移至編譯期進行,從而也避免了通過在頭文件定義並初始化變量來獲得代碼執行權的“騷操作”。
相較c++11 版本,本篇介紹的實現方案主要有如下優點:

  1. 不再需要在頭文件定義並初始化變量。
  2. 解析枚舉名的步驟移至編譯期進行,運行期間獲取枚舉名基本無額外開銷。
  3. 相比上一版本,還縮小了代碼體積,可從編譯產生的lib 大小看出。(c++11 lib大小增加主要原因是在頭文件定義並初始化變量導致,不過也可以進行優化,將初始化變量調用的模板函數改爲普通函數即可,不過代碼複雜度也相應提高了。)

關鍵技術

constexpr 函數

#define XXX(Type, ...) #__VA_ARGS__

XXX(Color, Red, Blue)"Red, Blue",現在我們不希望在運行期纔去解析每個Color 值對應的名字,我們希望在編譯期直接獲得一個字符串數組,之後運行期直接根據枚舉值到對應下標位置獲取字符串。

const char* NAMES[] = { "Red", "Blue" }; 
NAMES[ int(Color::Red) ] -> "Red"

constexpr 函數就提供了這樣的解決途徑,我們可以實現一個編譯期即可運行的字符串分割函數,傳入 "Red, Blue" 傳出 { "Red", "Blue" },之後將結果保存在一個全局位置即可。

源碼地址

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