3 回答

TA貢獻(xiàn)1770條經(jīng)驗(yàn) 獲得超3個(gè)贊
一個(gè)不錯(cuò)的折衷方法是這樣的:
struct Flintstones {
enum E {
Fred,
Barney,
Wilma
};
};
Flintstones::E fred = Flintstones::Fred;
Flintstones::E barney = Flintstones::Barney;
從版本上來(lái)說(shuō),它不是類(lèi)型安全的,但是用法比標(biāo)準(zhǔn)枚舉更好,并且在需要時(shí)仍可以利用整數(shù)轉(zhuǎn)換。

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超9個(gè)贊
我個(gè)人使用的是typesafe枚舉用法的改編版本。它沒(méi)有提供您在編輯中陳述的所有五個(gè)“要求”,但無(wú)論如何我還是非常不同意其中的一些。例如,我看不到Prio#4(將值轉(zhuǎn)換為字符串)與類(lèi)型安全有何關(guān)系。無(wú)論如何,大多數(shù)時(shí)間字符串表示形式的單個(gè)值都應(yīng)與類(lèi)型的定義分開(kāi)(考慮一下i18n的簡(jiǎn)單原因)。Prio#5(迭代,它是可選的)是我想看到的枚舉中自然發(fā)生的最好的事情之一,因此令您感到遺憾的是,它在您的請(qǐng)求中顯示為“可選”,但似乎可以通過(guò)以下方式更好地解決一個(gè)單獨(dú)的迭代系統(tǒng),例如begin/end 函數(shù)或enum_iterator,這使它們可與STL和C ++ 11 foreach無(wú)縫協(xié)作。
OTOH這個(gè)簡(jiǎn)單的成語(yǔ)很好地提供了Prio#3 Prio#1,這是因?yàn)樗鼘?shí)際上只會(huì)包裝enum帶有更多類(lèi)型信息的。更不用說(shuō)這是一個(gè)非常簡(jiǎn)單的解決方案,在很大程度上不需要任何外部依賴(lài)標(biāo)頭,因此很容易攜帶。它還具有使枚舉范圍為a-la-C ++ 11的優(yōu)點(diǎn):
// This doesn't compile, and if it did it wouldn't work anyway
enum colors { salmon, .... };
enum fishes { salmon, .... };
// This, however, works seamlessly.
struct colors_def { enum type { salmon, .... }; };
struct fishes_def { enum type { salmon, .... }; };
typedef typesafe_enum<colors_def> colors;
typedef typesafe_enum<fishes_def> fishes;
解決方案提供的唯一“漏洞”是,它無(wú)法解決無(wú)法阻止enum將不同類(lèi)型的s(或an enum和int)直接進(jìn)行比較的事實(shí),因?yàn)橹苯邮褂弥禃r(shí)會(huì)強(qiáng)制執(zhí)行隱式轉(zhuǎn)換至int:
if (colors::salmon == fishes::salmon) { .../* Ooops! */... }
但是到目前為止,我發(fā)現(xiàn)可以通過(guò)簡(jiǎn)單地與編譯器進(jìn)行更好的比較來(lái)解決這些問(wèn)題,例如,顯式提供一個(gè)可以比較任意兩種不同enum類(lèi)型的運(yùn)算符,然后強(qiáng)制其失?。?/p>
// I'm using backports of C++11 utilities like static_assert and enable_if
template <typename Enum1, typename Enum2>
typename enable_if< (is_enum<Enum1>::value && is_enum<Enum2>::value) && (false == is_same<Enum1,Enum2>::value) , bool >
::type operator== (Enum1, Enum2) {
static_assert (false, "Comparing enumerations of different types!");
}
盡管到目前為止似乎還沒(méi)有破壞代碼,并且確實(shí)可以不處理其他問(wèn)題而明確地處理特定問(wèn)題,但是我不確定這是“ 應(yīng)該 ”做的事情(我懷疑它會(huì)干擾enum已參與其他地方聲明的轉(zhuǎn)換運(yùn)算符;我很樂(lè)意收到對(duì)此的評(píng)論)。
將此與上面的類(lèi)型安全習(xí)慣相結(jié)合,就可以enum class在操作性(可讀性和可維護(hù)性)方面相對(duì)接近C ++ 11 ,而不必做任何過(guò)于晦澀的事情。而且我不得不承認(rèn)這樣做很有趣,我從沒(méi)想過(guò)要問(wèn)編譯器是否在處理enums ...
- 3 回答
- 0 關(guān)注
- 673 瀏覽
添加回答
舉報(bào)