C++奇淫巧技之SFINAE

SFINAE 技術(shù)窒悔,即匹配失敗不是錯誤阶界,英文Substitution Failure Is Not An Error,其作用是當(dāng)我們在進行模板特化的時候氧映,會去選擇那個正確的模板,避免失敗

看個具體的例子:

long multiply(int i, int j) { return i * j; }

template <class T>
typename T::multiplication_result multiply(T t1, T t2)
{
    return t1 * t2;
}
int main(void)
{
    multiply(4,5);
}

當(dāng)我們編譯的時候臼疫,會去匹配模板 multiply,但是由于我們不知道m(xù)ultiplication_result,根據(jù) Substitution Failure Is Not An Error 富蓄,于是我們就去選擇函數(shù) multiply

這種技術(shù)在代碼中的一個大的用途就是在編譯時期來確定某個 type 是否具有我們需要的性質(zhì),看代碼

template <class T>
struct is_pointer
{
    template <class U>
    static char is_ptr(U *);

    template <class X, class Y>
    static char is_ptr(Y X::*);

    template <class U>
    static char is_ptr(U (*)());

    static double is_ptr(...);

    static T t;
    enum { value = sizeof(is_ptr(t)) == sizeof(char) };
};

struct Foo {
    int bar;
};

void testTypeCheck() {
    typedef int * IntPtr;
    typedef int Foo::* FooMemberPtr;
    typedef int (*FuncPtr)();

    printf("%d\n",is_pointer<IntPtr>::value);        // prints 1
    printf("%d\n",is_pointer<FooMemberPtr>::value);  // prints 1
    printf("%d\n",is_pointer<FuncPtr>::value);       // prints 1
}

通過定義4個重載的 is_ptr函數(shù)胜卤,3個是接受不同的指針參數(shù)澈段,另一個則包括了其他的所有參數(shù),
IntPtr 是一個變量指針
FooMemberPtr 是一個成員屬性指針
FuncPtr 是一個函數(shù)指針

接著我們來看下 muduo 庫中的一段代碼:

template<typename T>
struct has_no_destroy {
    template<typename C>
    static char test(decltype(&C::no_destroy));


    template<typename C>
    static int32_t test(...);

    const static bool value = sizeof(test<T>(0)) == 1;
};
// 其作用就是用來判斷是否有 no_destroy 函數(shù)

struct A {

};

struct B {
    void no_destroy(){}
};
struct C {
    int no_destroy;
};

struct D : B {

};

void testNoDestroy() {
    printf("%d\n",has_no_destroy<A>::value);
    printf("%d\n",has_no_destroy<B>::value);
    printf("%d\n",has_no_destroy<C>::value);
    printf("%d\n",has_no_destroy<D>::value);
}

其作用主要是判斷是否有no_destroy鹦聪,并且在繼承上也成立淘太,但是繼承在不同的gcc版本上不一定成立赌莺,具體可以看:http://stackoverflow.com/questions/1966362/sfinae-to-check-for-inherited-member-functions

code地址:https://github.com/zhuanxuhit/happy-code/tree/master/src/idioms

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末喘蟆,一起剝皮案震驚了整個濱河市缓升,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蕴轨,老刑警劉巖橙弱,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異屈梁,居然都是意外死亡霜大,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門蝗碎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來湖笨,“玉大人,你說我怎么就攤上這事眠菇”甙埽” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵捎废,是天一觀的道長笑窜。 經(jīng)常有香客問我,道長登疗,這世上最難降的妖魔是什么排截? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮辐益,結(jié)果婚禮上断傲,老公的妹妹穿的比我還像新娘。我一直安慰自己智政,他們只是感情好认罩,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著续捂,像睡著了一般垦垂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上牙瓢,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天劫拗,我揣著相機與錄音,去河邊找鬼矾克。 笑死杨幼,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播差购,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼四瘫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了欲逃?” 一聲冷哼從身側(cè)響起找蜜,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稳析,沒想到半個月后洗做,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡彰居,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年诚纸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陈惰。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡畦徘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抬闯,到底是詐尸還是另有隱情井辆,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布溶握,位于F島的核電站杯缺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏睡榆。R本人自食惡果不足惜萍肆,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胀屿。 院中可真熱鬧塘揣,春花似錦、人聲如沸碉纳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劳曹。三九已至,卻和暖如春琅摩,著一層夾襖步出監(jiān)牢的瞬間铁孵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工房资, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蜕劝,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像岖沛,于是被迫代替她去往敵國和親暑始。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

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

  • error code(錯誤代碼)=0是操作成功完成婴削。error code(錯誤代碼)=1是功能錯誤廊镜。error c...
    Heikki_閱讀 3,379評論 1 9
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,516評論 1 51
  • error code(錯誤代碼)=2000是無效的像素格式。error code(錯誤代碼)=2001是指定的驅(qū)動...
    Heikki_閱讀 1,798評論 0 4
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉唉俗,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,709評論 0 9
  • 接著上節(jié) condition_varible 嗤朴,本節(jié)主要介紹future的內(nèi)容,練習(xí)代碼地址虫溜。本文參考http:/...
    jorion閱讀 14,791評論 1 5