enum是大家都比較喜歡用的一種結構,有助提供清晰的邏輯,有點技巧能使其更有用。
enum em<br />{<br />a =0,<br />b,<br />c,</p><p>NONE = 0xffffffff<br />}
以前經常看到這樣的代碼,不知其最後的NONE也何用,今天實際碰到時,才知道是多麼美妙的技巧啊。
一般的,用int i = b; 這樣的寫法,肯定是沒問題的,顯然,在這裡 i 等於1,但是,如果我要將int轉換為enum值,典型的情況,我用enum做為map的key:
map<em, string> mp;
這樣,使用時,我要根據key來擷取string,但是這個em可能不是以em的形式出現的,為了擴充性,很可能到你手裡就是一個int i 變數,即需要 mp.find(i); 來尋找,這樣就遇到了這個問題,如何將int轉換成enum?
enum之所以稱為enum,無非是為了節省記憶體,加快速度,很可能的,如果一個enum裡的元素只有10,20,那麼一個位元組就夠儲存表示它了,此時,你用一個int來轉成enum就會很麻煩,你可能會想到如果一個int的值一個位元組裝的下,那麼:
em e = (byte)i;
這樣應該就可以了,但是實際情況顯然更加複雜。你不能保證一種可行的方案是否在其他的編譯器上通過,畢竟enum的大小不是你能預見的(根據不同的編譯器,以及enum所表示的內容)。
但是,我們卻可以人工使他維持在一個穩定的記憶體大小狀態,通過在使用上面的寫法,最後的NONE是一個這樣的數,0xffffff,這在無符號數中是最大的,一般我們用enum是從0開始的,這樣,就表示了整個無符號數的大小。所以這個enum基本是就是一個4位元組大小的對象了,反正不會小於4位元組,至於大於的情況,我是沒遇到。
接著,就可以通過這樣:
em e = (em)((DWORD)i);
來將int i 轉換成em,將i轉為(DWORD)是需要的,考慮到兩者表示的數的範圍相同。