C++11——專業(yè)工具和技術(shù)

范圍enum(Scoped enum)

枚舉使我們可以將一組整型常量組合在一起姆另。與類一樣臼予,每個枚舉定義一個新類型撩轰。枚舉是文本類型胯甩。
C++有兩種枚舉:范圍和非范圍昧廷。新標(biāo)準(zhǔn)引入了范圍枚舉。我們使用關(guān)鍵字enum class(或等價的enum struct)定義一個范圍枚舉偎箫,后面跟著枚舉名稱和用大括號括起來的以逗號分隔的枚舉器列表木柬。分號跟在大括號后面:

Code:
    enum class open_modes {input, output, append};

這里我們定義了一個名為open_modes的枚舉類型,它有三個枚舉器:input淹办,outputappend眉枕。
我們通過省略class(或struct)關(guān)鍵字來定義一個不帶范圍的枚舉。枚舉名稱在非范圍枚舉中是可選的:

Code:
    enum color {red, yellow, green};  // unscoped enumeration
    // unnamed, unscoped enum
    enum {floatPrec = 6, doublePrec = 10, double_doublePrec = 10};

如果枚舉未命名怜森,則只能將該類型的對象定義為枚舉定義的一部分速挑。與類定義一樣,我們可以在結(jié)束枚舉定義的大括號和分號之間提供一個用逗號分隔的聲明符列表副硅。

指定用于保存enum的類型

盡管每個枚舉定義了一個唯一的類型姥宝,但它由一個內(nèi)置的整型表示。在新標(biāo)準(zhǔn)下恐疲,我們可以通過在枚舉名稱后面加上冒號和要使用的類型的名稱來指定該類型腊满。

Code:
    enum intValues : unsigned long long {
        charTyp = 255, shortTyp = 65535, intTyp = 65535,
        longTyp = 4294967295UL,
        long_longTyp = 18446744073709551615ULL
    };

如果不指定基礎(chǔ)類型,那么默認(rèn)情況下流纹,范圍枚舉的基礎(chǔ)類型為int糜烹。非范圍枚舉沒有默認(rèn)值倘潜;我們只知道基礎(chǔ)類型足夠大缝其,可以容納枚舉器值诫睬。當(dāng)指定了基礎(chǔ)類型(包括為范圍枚舉隱式指定)時重斑,枚舉器的值太大药版,不適合該類型是錯誤的缀皱。
由于能夠指定枚舉的基礎(chǔ)類型呻此,我們可以控制不同實(shí)現(xiàn)中使用的類型备禀。我們可以確信壁公,在一個實(shí)現(xiàn)下編譯的程序在另一個實(shí)現(xiàn)上編譯時會生成相同的代碼感论。

enum的前向聲明

根據(jù)新標(biāo)準(zhǔn),我們可以前向聲明enum紊册。enum前向聲明必須(隱式或顯式地)指定枚舉的基礎(chǔ)大斜纫蕖:

Code:
    // forward declaration of unscoped enum named intValues
    enum intValues : unsigned long long; // unscoped, must specify a type
    enum class open_modes;  // scoped enums can use int by default

因?yàn)榉欠秶杜e沒有默認(rèn)大小,所以每個聲明都必須包含該枚舉的大小囊陡。我們可以聲明一個范圍枚舉芳绩,而不指定大小,在這種情況下撞反,大小被隱式定義為int妥色。
與任何聲明一樣,給定枚舉的所有聲明和定義必須相互匹配遏片。對于枚舉嘹害,此要求意味著枚舉的大小必須在所有聲明和枚舉定義中相同撮竿。
此外,我們不能在一個上下文中將名稱聲明為非范圍枚舉笔呀,并在以后將其重新聲明為范圍枚舉:

Code:
    // error: declarations and definition must agree whether the enum is scoped or unscoped
    enum class intValues;
    enum intValues;  // error: intValues previously declared as scoped   enum
    enum intValues : long; // error: intValues previously declared as int

標(biāo)準(zhǔn)庫mem_fn類模板

要使用function幢踏,我們必須提供要調(diào)用的成員的調(diào)用簽名。相反凿可,我們可以使用另一個庫工具mem_fn讓編譯器來推斷成員的類型惑折,該工具在頭文件<functional>中定義授账。與function一樣枯跑,mem_fn從指向成員的指針生成可調(diào)用對象。與function不同白热,mem_fn將從指向成員的指針類型推導(dǎo)出可調(diào)用類型:

Code:
    find_if(svec.begin(), svec.end(), mem_fn(&string::empty));

這里我們使用mem_fn(&string::empty)生成一個可調(diào)用對象敛助,該對象接受一個字符串參數(shù)并返回一個bool
mem_fn生成的可調(diào)用對象可以在對象或指針上調(diào)用:

Code:
    auto f = mem_fn(&string::empty); // f takes a string or a string*
    f(*svec.begin()); // ok: passes a string object; f uses .* to call empty
    f(&svec[0]);      // ok: passes a pointer to string; f uses .-> to call empty

實(shí)際上屋确,我們可以將mem_fn想象成它使用重載的函數(shù)調(diào)用操作符生成一個可調(diào)用的函數(shù)纳击,一個接受string*,另一個接受string&攻臀。

參考文獻(xiàn)

[1] Lippman S B , Josée Lajoie, Moo B E . C++ Primer (5th Edition)[J]. 2013.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末焕数,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子刨啸,更是在濱河造成了極大的恐慌堡赔,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件设联,死亡現(xiàn)場離奇詭異善已,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)离例,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門换团,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宫蛆,你說我怎么就攤上這事艘包。” “怎么了耀盗?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵想虎,是天一觀的道長。 經(jīng)常有香客問我袍冷,道長磷醋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任胡诗,我火速辦了婚禮邓线,結(jié)果婚禮上淌友,老公的妹妹穿的比我還像新娘。我一直安慰自己骇陈,他們只是感情好震庭,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著你雌,像睡著了一般器联。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上婿崭,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天拨拓,我揣著相機(jī)與錄音,去河邊找鬼氓栈。 笑死渣磷,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的授瘦。 我是一名探鬼主播醋界,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼提完!你這毒婦竟也來了形纺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤徒欣,失蹤者是張志新(化名)和其女友劉穎逐样,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帚称,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡官研,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了闯睹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戏羽。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖楼吃,靈堂內(nèi)的尸體忽然破棺而出始花,到底是詐尸還是另有隱情,我是刑警寧澤孩锡,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布酷宵,位于F島的核電站,受9級特大地震影響躬窜,放射性物質(zhì)發(fā)生泄漏浇垦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一荣挨、第九天 我趴在偏房一處隱蔽的房頂上張望男韧。 院中可真熱鬧朴摊,春花似錦、人聲如沸此虑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽朦前。三九已至介杆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間韭寸,已是汗流浹背春哨。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棒仍,地道東北人悲靴。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓臭胜,卻偏偏與公主長得像莫其,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子耸三,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容