溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2022-03-14 09:18:03 來(lái)源:億速云 閱讀:175 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹如何解決c++11實(shí)現(xiàn)枚舉值到枚舉名的轉(zhuǎn)換問(wèn)題,文中介紹的非常詳細(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)變量可以用于存放枚舉值到枚舉字符串的映射,而將枚舉類型作為模板參數(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__);

以上是“如何解決c++11實(shí)現(xiàn)枚舉值到枚舉名的轉(zhuǎn)換問(wèn)題”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI