最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++11?實(shí)現(xiàn)枚舉值到枚舉名的轉(zhuǎn)換問(wèn)題

 更新時(shí)間:2022年03月11日 17:00:25   作者:hchlqlz  
這篇文章主要介紹了c++11?實(shí)現(xiàn)枚舉值到枚舉名的轉(zhuǎn)換,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

效果

ENUM_DEFINE ( Color,
    Red,
    Blue,
)

EnumHelper(Color::Red) -> "Red"
EnumHelper(Color::Red, std::toupper) -> "RED"

關(guān)鍵技術(shù)

__VA_ARGS__

__VA_ARGS__ 實(shí)現(xiàn)了可變參數(shù)的宏。

#define XXX(type, ...) enum class type { __VA_ARGS__ };

XXX(Color, Red, Blue) 等價(jià)于:

enum class Color
{
    Red,
    Blue
};

#__VA_ARGS__

#__VA_ARGS__ 可將宏的可變參數(shù)轉(zhuǎn)為字符串。

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

XXX(Color, Red, Blue) 等價(jià)于:"Red, Blue"

在函數(shù)外執(zhí)行代碼的能力

在函數(shù)體外,可以通過(guò)定義全局變量來(lái)執(zhí)行一個(gè)函數(shù)。需要注意的是,頭文件中正常是不能進(jìn)行變量初始化的,除非加上 static 或者 const。

const int temp = initialize();

另外,如果多個(gè)代碼文件 #include 了該頭文件,會(huì)產(chǎn)生多個(gè)變量,即在不同代碼文件取得的 temp 變量不是同一個(gè)。與之對(duì)應(yīng),initialize 函數(shù)也會(huì)調(diào)用多次。

模板函數(shù)的靜態(tài)變量

函數(shù)的靜態(tài)變量可以用于存放枚舉值到枚舉字符串的映射,而將枚舉類(lèi)型作為模板參數(shù)的模板函數(shù),則可以直接為每種枚舉提供了一個(gè)映射容器。

關(guān)鍵代碼

template<typename T>
string EnumHelper(T key, const std::function<char(char)> processor = nullptr, const char* pszName = NULL)
{
    static_assert(std::is_enum_v<T>, __FUNCTION__ "'s key need a enum");

    static map<T, string> s_mapName;
    if (nullptr != pszName)
    {
        s_mapName[key] = pszName;
    }
    std::string res = "";
    auto it = s_mapName.find(key);
    if (it != s_mapName.end())
        res = it->second;
    if (nullptr != processor)
        std::transform(res.begin(), res.end(), res.begin(), processor);
    return res;
}
template <class T>
size_t analystEnum(T enumClass, const char* pszNames)
    static_assert(std::is_enum_v<T>, __FUNCTION__ "'s enumClass need a enum");
    cout << "analystEnum: " << pszNames << endl;
    if (nullptr != pszNames)
        const vector<string>& vecName = split(pszNames, ",");
        for (int i = 0; i < vecName.size(); ++i)
        {
            if (vecName.at(i).size() > 0)
            {
                EnumHelper((T)(i + 1), nullptr, vecName.at(i).c_str() + (i == 0 ? 0 : 1) );
            }
        }
        return rand();
    return rand();
#define ENUM_DEFINE(type, ...) enum class type { placeholder, __VA_ARGS__ }; static const size_t g_uEnumSizeOf##type = analystEnum(type::placeholder, #__VA_ARGS__);

源碼地址

到此這篇關(guān)于c++11 實(shí)現(xiàn)枚舉值到枚舉名的轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)c++11 枚舉值到枚舉名的轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談C++內(nèi)存管理基礎(chǔ)知識(shí)

    淺談C++內(nèi)存管理基礎(chǔ)知識(shí)

    這篇文章主要為大家介紹了C++的內(nèi)存管理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • c++ 虛繼承,多繼承相關(guān)總結(jié)

    c++ 虛繼承,多繼承相關(guān)總結(jié)

    這篇文章主要介紹了c++虛繼承,多繼承相關(guān)總結(jié),幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下
    2021-03-03
  • C++設(shè)計(jì)模式中的橋模式你了解嗎

    C++設(shè)計(jì)模式中的橋模式你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C++設(shè)計(jì)模式中的橋模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 如何在Qt中實(shí)現(xiàn)關(guān)于Json?的操作

    如何在Qt中實(shí)現(xiàn)關(guān)于Json?的操作

    JSON是一種輕量級(jí)數(shù)據(jù)交換格式,常用于客戶(hù)端和服務(wù)端的數(shù)據(jù)交互,不依賴(lài)于編程語(yǔ)言,在很多編程語(yǔ)言中都可以使用JSON,這篇文章主要介紹了在Qt中實(shí)現(xiàn)關(guān)于Json的操作,需要的朋友可以參考下
    2023-08-08
  • C++ Boost Archive超詳細(xì)講解

    C++ Boost Archive超詳細(xì)講解

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)
    2022-12-12
  • 如何通過(guò)指針突破C++類(lèi)的訪(fǎng)問(wèn)權(quán)限

    如何通過(guò)指針突破C++類(lèi)的訪(fǎng)問(wèn)權(quán)限

    這篇文章主要介紹了通過(guò)指針突破C++類(lèi)的訪(fǎng)問(wèn)權(quán)限,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 詳解C語(yǔ)言中的Static關(guān)鍵字

    詳解C語(yǔ)言中的Static關(guān)鍵字

    這篇文章主要為大家介紹了C語(yǔ)言中Static關(guān)鍵字,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • QT網(wǎng)絡(luò)編程Tcp下C/S架構(gòu)的即時(shí)通信實(shí)例

    QT網(wǎng)絡(luò)編程Tcp下C/S架構(gòu)的即時(shí)通信實(shí)例

    下面小編就為大家?guī)?lái)一篇QT網(wǎng)絡(luò)編程Tcp下C/S架構(gòu)的即時(shí)通信實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • C語(yǔ)言俄羅斯方塊游戲課程設(shè)計(jì)

    C語(yǔ)言俄羅斯方塊游戲課程設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言俄羅斯方塊游戲課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++中g(shù)etline()、gets()等函數(shù)的用法詳解

    C++中g(shù)etline()、gets()等函數(shù)的用法詳解

    這篇文章主要介紹了C++中g(shù)etline()、gets()等函數(shù)的用法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02

最新評(píng)論

望都县| 黄大仙区| 康保县| 洪雅县| 新宾| 开阳县| 桦南县| 邵阳县| 黄大仙区| 武安市| 南安市| 内黄县| 专栏| 大化| 天水市| 泗洪县| 大宁县| 木里| 互助| 贺兰县| 广汉市| 那曲县| 敦煌市| 延安市| 桦甸市| 杭锦旗| 祥云县| 滦平县| 西安市| 泸溪县| 望城县| 洞头县| 沈阳市| 马龙县| 炎陵县| 青浦区| 化州市| 巨鹿县| 石屏县| 沂源县| 壤塘县|