第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

您正在使用C ++中的哪個(gè)Typesafe枚舉?

您正在使用C ++中的哪個(gè)Typesafe枚舉?

眾所周知,C ++中的內(nèi)置枚舉不是類(lèi)型安全的。我想知道在那里使用了哪些實(shí)現(xiàn)類(lèi)型安全枚舉的類(lèi)……我本人使用以下“自行車(chē)”,但是它有些冗長(zhǎng)和有限:typesafeenum.h:struct TypesafeEnum{// Construction:public:    TypesafeEnum(): id (next_id++), name("") {}    TypesafeEnum(const std::string& n): id(next_id++), name(n) {}// Operations:public:    bool operator == (const TypesafeEnum& right) const;    bool operator != (const TypesafeEnum& right) const;    bool operator < (const TypesafeEnum& right) const;    std::string to_string() const { return name; }// Implementation:private:    static int next_id;    int id;    std::string name;};typesafeenum.cpp:int TypesafeEnum::next_id = 1;bool TypesafeEnum::operator== (const TypesafeEnum& right) const { return id == right.id; }bool TypesafeEnum::operator!= (const TypesafeEnum& right) const { return !operator== (right); }bool TypesafeEnum::operator< (const TypesafeEnum& right) const  { return id < right.id; }用法:class Dialog { ...    struct Result: public TypesafeEnum    {        static const Result CANCEL("Cancel");        static const Result OK("Ok");    };    Result doModal(); ...};const Dialog::Result Dialog::Result::OK;const Dialog::Result Dialog::Result::CANCEL;另外: 我認(rèn)為我應(yīng)該更具體地說(shuō)明這些要求。我將嘗試總結(jié)一下:優(yōu)先級(jí)1:毫無(wú)例外,將枚舉變量設(shè)置為無(wú)效值應(yīng)該是不可能的(編譯時(shí)錯(cuò)誤)。優(yōu)先級(jí)2:應(yīng)該可以通過(guò)單個(gè)顯式函數(shù)/方法調(diào)用將枚舉值與int轉(zhuǎn)換。優(yōu)先級(jí)3:盡可能緊湊,優(yōu)雅,方便的聲明和使用優(yōu)先級(jí)4:將枚舉值與字符串進(jìn)行相互轉(zhuǎn)換。優(yōu)先級(jí)5 :(很高興)迭代枚舉值的可能性。
查看完整描述

3 回答

?
德瑪西亞99

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)換。


查看完整回答
反對(duì) 回復(fù) 2019-10-25
?
千萬(wà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 ...


查看完整回答
反對(duì) 回復(fù) 2019-10-25
  • 3 回答
  • 0 關(guān)注
  • 673 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)