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" },之后將結果保存在一個全局位置即可。

源碼地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM