1. 程式人生 > >C++11新特性(81)-有作用域的enum(scoped enumeration)

C++11新特性(81)-有作用域的enum(scoped enumeration)

列舉型別的困惑

從C語言過度到C++以後,列舉作為減少程式錯誤的手段之一被廣泛地使用。但是同時也帶來一個問題:列舉值的重複。假設我們有下面的三原色定義:

程式碼中同時也需要定義三基色:

二者同時定義之後,就會遇到一個問題:red和blue連個值都被重複定義。

 

傳統的解決方法

修改列舉值的名稱當然是一個方法,只是比較低階,我們就不討論了。一般的做法是將列舉型別的定義放到不同的一個作用域(類或名稱空間)中。例如:

這樣兩個列舉定義就不會發生衝突了。可以用如下方式使用這兩個列舉型別:

略顯繁瑣,但足夠有效。

 

C++11的解決方式

C++11中引入了限定作用域的列舉型別的概念。其用法如下:

和前面的方式進行比較可以發現:只是在標準的列舉型別定義格式中增加了class關鍵字。它的效果就是為列舉值同時定義了一個和列舉型別同名的作用域。定義了限定作用域的列舉型別之後,可以以如下方式使用:

作者一句話

這種方法即為利用者提供了直接使用Elight型別和EPaint型別的便利,又為列舉值定義提供了自然而然的作用域。雖然簡單,但細思極妙。

    

示例程式碼下載地址

https://github.com/xueweiguo/OOThinking/blob/master/20180529%20ScopedEnumeration.cpp

 

覺得本文有幫助?請分享給更多人。

閱讀更多更新文章,請掃描下面二維碼,關注微信公眾號【面向物件思考】