MongoDB源碼:StatusWith

相關(guān)的類

  • Status

StatusWith<ResultType> 用于返回結(jié)果,如果計(jì)算結(jié)果的過(guò)程中出現(xiàn)錯(cuò)誤优训,則返回錯(cuò)誤狀態(tài) Status敌卓。源碼中有一個(gè)例子,可以形象的看出 StatusWith 的使用方法终佛。

StatusWith<int> fib( int n ) {
    if ( n < 0 )
        return StatusWith<int>( ErrorCodes::BadValue, "parameter to fib has to be >= 0" );
    if ( n <= 1 ) return StatusWith<int>( 1 );
    StatusWith<int> a = fib( n - 1 );
    StatusWith<int> b = fib( n - 2 );
    if ( !a.isOK() ) return a;
    if ( !b.isOK() ) return b;
    return StatusWith<int>( a.getValue() + b.getValue() );
}

StatusWith 包含一些實(shí)現(xiàn)的細(xì)節(jié),如:

  • 禁用 StatusWith<Status>StatusWith<StatusWith<T>>
  • TagType
  • transform

下文主要針對(duì)這些細(xì)節(jié)雾家,做了一定的解讀查蓉。

禁用 StatusWith<Status> 和 StatusWith<StatusWith<T>>

代碼中使用如下語(yǔ)句在編譯期間檢測(cè)是否存在 StatusWith<Status>StatusWith<StatusWith<T>>

MONGO_STATIC_ASSERT_MSG(!isStatusOrStatusWith<T>,
                        "StatusWith<Status> and StatusWith<StatusWith<T>> are banned.");

其中 MONGO_STATIC_ASSERT_MSGstatic_assert 的封裝,static_assert 在編譯期間判斷第一個(gè)參數(shù)對(duì)應(yīng)的表達(dá)式是否為 true榜贴,如果為 false 則報(bào)錯(cuò)豌研。

在這里妹田,表達(dá)式為 !isStatusOrStatusWith<T>,該表達(dá)式是如何在編譯期計(jì)算的呢鹃共?

// Using extern constexpr to prevent the compiler from allocating storage as a poor man's c++17
// inline constexpr variable.
// TODO delete extern in c++17 because inline is the default for constexpr variables.
template <typename T>
extern constexpr bool isStatusWith = false;
template <typename T>
extern constexpr bool isStatusWith<StatusWith<T>> = true;

template <typename T>
extern constexpr bool isStatusOrStatusWith =
    std::is_same<T, mongo::Status>::value || isStatusWith<T>;

extern constexpr 不太明白其作用

通過(guò) is_same 和 存在特化的isStatusWith 即可在編譯期間完成類型的判斷鬼佣。

TagType

TagType 的定義如下:

struct TagTypeBase {
protected:
    TagTypeBase() = default;
};
// `TagType` is used as a placeholder type in parameter lists for `enable_if` clauses.  They
// have to be real parameters, not template parameters, due to MSVC limitations.
class TagType : TagTypeBase {
    TagType() = default;
    friend StatusWith;
};

因此 TagType 內(nèi)部沒(méi)有具體的功能,因此其功能在其存在上霜浴,如:

template <typename Alien>
StatusWith(Alien&& alien,
            typename std::enable_if_t<std::is_convertible<Alien, T>::value, TagType> = makeTag(),
            typename std::enable_if_t<!std::is_same<Alien, T>::value, TagType> = makeTag())
    : StatusWith(static_cast<T>(std::forward<Alien>(alien))) {}

其中晶衷,enable_if_tis_convertibleis_same 配合使用,利用SFINAE的特性阴孟,生成符合要求的構(gòu)造函數(shù)晌纫,如這里的要求為:

  • Alien 必須能夠轉(zhuǎn)換成 T
  • Alien 必須不能為 T

transform

StatusWith 實(shí)現(xiàn)了 transform 函數(shù),如果StatusWith 為值永丝,那么對(duì)該值應(yīng)用一個(gè)函數(shù)锹漱,如果 StatusWith 為錯(cuò)誤狀態(tài),則以該錯(cuò)誤狀態(tài)創(chuàng)建新的 StatusWith 并返回慕嚷。

template <typename F>
StatusWith<std::invoke_result_t<F&&, T&>> transform(F&& f) & {
    if (_t)
        return {std::forward<F>(f)(*_t)};
    else
        return {_status};
}

其中哥牍,invoke_result_t 的原型如下:

template<class F, class... ArgTypes>
class invoke_result;

template< class F, class... ArgTypes>
using invoke_result_t = typename invoke_result<F, ArgTypes...>::type;

F 為可調(diào)用的類型,invoke_result 返回該調(diào)用類型以 ArgTypes 的參數(shù)類型調(diào)用的時(shí)候的返回值的類型喝检。這里使用 F&& 是為了做完美轉(zhuǎn)發(fā)的用途嗅辣。

參考連接

此外,該函數(shù)后面存在一個(gè) &挠说,這是函數(shù)引用限定澡谭,可以為 &&&,引用限定可以讓成員函數(shù)只能被左值對(duì)象調(diào)用或者只能被右值對(duì)象調(diào)用损俭。

總結(jié)

StatusWith 適合在某容易出現(xiàn)錯(cuò)誤的計(jì)算序列中存儲(chǔ)中間的計(jì)算結(jié)果译暂,可能有利于設(shè)計(jì)好的錯(cuò)誤處理。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末撩炊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子崎脉,更是在濱河造成了極大的恐慌拧咳,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件囚灼,死亡現(xiàn)場(chǎng)離奇詭異骆膝,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)灶体,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)阅签,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蝎抽,你說(shuō)我怎么就攤上這事政钟。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵养交,是天一觀的道長(zhǎng)精算。 經(jīng)常有香客問(wèn)我,道長(zhǎng)碎连,這世上最難降的妖魔是什么灰羽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮鱼辙,結(jié)果婚禮上廉嚼,老公的妹妹穿的比我還像新娘。我一直安慰自己倒戏,他們只是感情好怠噪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著峭梳,像睡著了一般舰绘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上葱椭,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天捂寿,我揣著相機(jī)與錄音,去河邊找鬼孵运。 笑死秦陋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的治笨。 我是一名探鬼主播驳概,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼旷赖!你這毒婦竟也來(lái)了顺又?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤等孵,失蹤者是張志新(化名)和其女友劉穎稚照,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體俯萌,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡果录,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了咐熙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弱恒。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖棋恼,靈堂內(nèi)的尸體忽然破棺而出返弹,到底是詐尸還是另有隱情锈玉,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布琉苇,位于F島的核電站嘲玫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏并扇。R本人自食惡果不足惜去团,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望穷蛹。 院中可真熱鬧土陪,春花似錦、人聲如沸肴熏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蛙吏。三九已至源哩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸦做,已是汗流浹背励烦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泼诱,地道東北人坛掠。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像治筒,于是被迫代替她去往敵國(guó)和親屉栓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法耸袜,類相關(guān)的語(yǔ)法友多,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法堤框,異常的語(yǔ)法域滥,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,641評(píng)論 18 399
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)胰锌,斷路器,智...
    卡卡羅2017閱讀 134,665評(píng)論 18 139
  • 小編費(fèi)力收集:給你想要的面試集合 1.C++或Java中的異常處理機(jī)制的簡(jiǎn)單原理和應(yīng)用藐窄。 當(dāng)JAVA程序違反了JA...
    八爺君閱讀 4,592評(píng)論 1 114
  • 簡(jiǎn)介 C++98/03的設(shè)計(jì)目標(biāo):一资昧、比C語(yǔ)言更適合系統(tǒng)編程(且與C語(yǔ)言兼容)。二荆忍、支持?jǐn)?shù)據(jù)抽象格带。三撤缴、支持面向?qū)ο?..
    認(rèn)真學(xué)計(jì)算機(jī)閱讀 5,326評(píng)論 0 53
  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,938評(píng)論 2 89