亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C++ std::enable_if解析

2019-11-14 09:27:23
字體:
來源:轉載
供稿:網友

引言

今日在閱讀LLVM相關源碼時(如下所示),遇到了enable_if<>這個概念,以前從沒有遇到過,這里做個小記。

/*----------llvm/include/llvm/ADT/Hashing.h------------*//// /brief Compute a hash_code for any integer value.////// Note that this function is intended to compute the same hash_code for/// a particular value without regard to the PRe-promotion type. This is in/// contrast to hash_combine which may produce different hash_codes for/// differing argument types even if they would implicit promote to a common/// type without changing the value.template <typename T>typename std::enable_if<is_integral_or_enum<T>::value, hash_code>::typehash_value(T value);123456789101112123456789101112

enable_if 的主要作用就是當某個 condition 成立時,enable_if可以提供某種類型。enable_if在標準庫中通過結構體模板實現的,聲明如下:

template<bool Cond, class T = void> struct enable_if;11

英文解釋如下:

Enable type if the condition is met. The type T is enabled as member type enable_if::type if Cond is true. Otherwise, enable_if::type is not defined.

但是當 condition 不滿足的時候,enable_if<>::type 就是未定義的,當用到模板相關的場景時,只會 instantiate fail,并不會編譯錯誤,這時很重要的一點。為了理解 std::enable_if<> 的實現,我們先來了解一下 SFINAE。


SFINAE

SFINAE 是C++ 的一種語言屬性,具體內容就是”從一組重載函數中刪除模板實例化無效的函數”。

Prune functions that do not yield valid template instantiations from a set of overload functions.

SFINAE 的的全稱是 Substitution Failure Is Not An Error。

SFINAE 應用最為廣泛的場景是C++中的 std::enable_if,這里有完整的英文描述:

In the process of template argument deduction, a C++ compiler attempts to instantiate signatures of a number of candidate overloaded functions to make sure that exactly one overloaded function is available as a perfect match for a given function call.

從上面的描述中我們可以看到,在對一個函數調用進行模板推導時,編譯器會嘗試推導所有的候選函數(重載函數,模板,但是普通函數的優先級要高),以確保得到一個最完美的匹配。

If an invalid argument or return type is formed during the instantiation of a function template, the instantiation is removed from the overload resolution set instead of causing a compilation error. As long as there is one and only one function to which the call can be dispatched, the compiler issues no errors.

也就是說在推導的過程中,如果出現了無效的模板參數,則會將該候選函數從重載決議集合中刪除,只要最終得到了一個 perfect match ,編譯就不會報錯。

如下代碼所示:

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);}123456789101112123456789101112

main 函數調用 multiply 會使編譯器會盡可能去匹配所有候選函數,雖然第一個 multiply 函數明顯是較優的匹配,但是為了得到一個最精確的匹配,編譯器依然會嘗試去匹配剩下的候選函數,此時就會去推導 第二個multiply函數,中間在參數推導的過程中出現了一個無效的類型 int::multiplication_result ,但是因為 SFINAE 原則并不會報錯。


std::enable_if<> 的實現

前面我們在介紹 std::enable_if 的時候提到,如果 condition 不滿足的話,會生成一個無效的類型,此處由于SFINAE 機制的存在,只要 call 存在一個匹配的話,就不會報錯(只是簡單的丟棄該函數)。

std::enable_if<>的實現機制如下代碼所示:

template<bool Cond, typename T = void> struct enable_if {};template<typename T> struct enable_if<true, T> { typedef T type; };123123

從上面的代碼可以看到

在 condition 為真的時候,由于偏特化機制,第二個結構體模板明顯是一個更好的匹配,所以 std::enable_if<>::type 就是有效的。

當 condition 為假的時候,只有第一個結構體模板能夠匹配,所以std::enable_if<>::type 是無效的,會被丟棄,編譯器會報錯:error: no type named ‘type’ in ‘struct std::enable_if<false, bool>。

Note: 下面是Visual Studio 2013的實現:

    // TEMPLATE CLASS enable_iftemplate<bool _Test,    class _Ty = void>    struct enable_if    {   // type is undefined for assumed !_Test    };template<class _Ty>    struct enable_if<true, _Ty>    {   // type is _Ty for _Test    typedef _Ty type;    };123456789101112123456789101112

std::enable_if<> 使用及使用

std::enable_if<> 的使用原型如下所示:

template <bool Cond, class T = void> struct enable_if;11Cond, A compile-time constant of type boolT, A type.

使用 enable_if 的時候,對參數有這兩方面的限制。

member typedefinition
typeT (defined only if Cond is true)

該例子來自于 這里:

// enable_if example: two ways of using enable_if#include <iostream>#include <type_traits>// 1. the return type (bool) is only valid if T is an integral type:template <class T>typename std::enable_if<std::is_integral<T>::value,bool>::type  is_odd (T i) {return bool(i%2);}// 2. the second template argument is only valid if T is an integral type:template < class T,           class = typename std::enable_if<std::is_integral<T>::value>::type>bool is_even (T i) {return !bool(i%2);}int main() {  short int i = 1;    // code does not compile if type of i is not integral  std::cout << std::boolalpha;  std::cout << "i is odd: " << is_odd(i) << std::endl;  std::cout << "i is even: " << is_even(i) << std::endl;  return 0;}123456789101112131415161718192021222324123456789101112131415161718192021222324頂
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久影视精品| 日韩精品中文字幕在线| 伊人久久久久久久久久| 丝袜美腿精品国产二区| 丰满岳妇乱一区二区三区| 精品福利在线视频| 国产成人jvid在线播放| 国产综合色香蕉精品| 亚洲一区二区久久| 日本一区二区不卡| 自拍偷拍亚洲一区| 亚洲免费视频在线观看| 欧日韩在线观看| 国产大片精品免费永久看nba| 久久欧美在线电影| 91久久精品国产91久久| 国产原创欧美精品| 91精品国产综合久久久久久蜜臀| 成人免费网站在线看| 欧美性猛交xxxx乱大交| 日av在线播放中文不卡| 亚洲日韩中文字幕| 亚州成人av在线| 国产精品一区二区久久| 国产午夜精品麻豆| 性欧美视频videos6一9| 精品久久久中文| 日韩久久精品成人| 国产欧美婷婷中文| 国产精品久久久久久久av电影| 欧美日韩亚洲精品内裤| 亚洲精品影视在线观看| 日韩综合视频在线观看| 亚洲人成77777在线观看网| 91高清视频免费| 成人福利网站在线观看11| 青青久久av北条麻妃海外网| 狠狠躁18三区二区一区| 国内成人精品一区| 美日韩丰满少妇在线观看| 97人人模人人爽人人喊中文字| 国产精品入口夜色视频大尺度| 少妇av一区二区三区| 日韩欧美第一页| 91国内免费在线视频| 久久久视频免费观看| 国产午夜精品视频免费不卡69堂| 日韩av在线资源| 亚洲欧美日韩区| 欧美体内谢she精2性欧美| 国产欧美日韩中文| 久久精品色欧美aⅴ一区二区| 亚洲黄色片网站| 色偷偷91综合久久噜噜| 亚洲欧洲激情在线| 在线播放国产精品| 亚洲人线精品午夜| 97在线视频免费| 亚洲精品一区二区网址| 亚洲天堂精品在线| 一区二区三区视频免费在线观看| 91亚洲人电影| 精品久久久久久中文字幕一区奶水| 中文字幕久热精品在线视频| 亚洲欧美色婷婷| 亚洲天堂成人在线视频| 伊人青青综合网站| 欧美激情精品久久久久久久变态| 亚州精品天堂中文字幕| 亚洲成人网在线观看| 久久九九全国免费精品观看| 精品日韩中文字幕| 亚洲欧洲日产国产网站| 精品自拍视频在线观看| 日韩成人av在线播放| 一区二区三区四区在线观看视频| 深夜福利日韩在线看| 在线免费看av不卡| 精品综合久久久久久97| 欧美专区日韩视频| 欧美一区视频在线| 亚洲国产欧美一区二区三区同亚洲| 精品久久久久久久久久久久久久| 久久这里只有精品视频首页| 欧美成人午夜影院| 久久九九全国免费精品观看| 中文字幕精品久久| 久久国产精品影片| 国产精品69精品一区二区三区| 国产美女久久精品香蕉69| 欧美老女人性生活| 欧美体内谢she精2性欧美| 亚洲精品电影在线观看| 国产精品久久久久福利| 91免费观看网站| 成人网在线免费看| 日韩三级成人av网| 97久久久久久| 欧美自拍视频在线| 久久精品国产精品亚洲| 精品久久久久人成| 亚洲男女自偷自拍图片另类| 欧美性猛交xxxx富婆| 久久不射电影网| 国产精品∨欧美精品v日韩精品| 久久精品夜夜夜夜夜久久| 欧美—级a级欧美特级ar全黄| 日韩av在线播放资源| 中文字幕v亚洲ⅴv天堂| 亚洲国产精品视频在线观看| 伊人伊人伊人久久| 伊人av综合网| 欧美成人免费全部| 国产精品美腿一区在线看| 成人精品视频久久久久| 国产精品一区电影| 在线精品国产成人综合| 国产精品免费视频久久久| 久久青草精品视频免费观看| 亚洲老板91色精品久久| 5566成人精品视频免费| 久久成人在线视频| 亚洲高清福利视频| 九九热视频这里只有精品| 亚洲肉体裸体xxxx137| 97人人模人人爽人人喊中文字| 欧美色视频日本高清在线观看| 日韩av电影免费观看高清| 欧美日韩激情美女| 欧美网站在线观看| 欧美国产极速在线| 亚洲人成人99网站| 国产午夜精品美女视频明星a级| 国产精品一二三视频| 最近2019免费中文字幕视频三| 国产va免费精品高清在线| 日韩欧美大尺度| 91在线色戒在线| 97人人做人人爱| 欧美黄色片免费观看| 国产欧美一区二区三区久久| 曰本色欧美视频在线| 亚洲欧美精品中文字幕在线| 日韩精品中文在线观看| 尤物九九久久国产精品的特点| 国产精品欧美久久久| 国产视频精品在线| 欧美乱大交做爰xxxⅹ性3| 国产精品福利在线观看| 久久亚洲精品中文字幕冲田杏梨| 日韩av片免费在线观看| 97福利一区二区| 韩曰欧美视频免费观看| 久久视频在线观看免费| 欧美精品精品精品精品免费| 欧美电影免费在线观看| 亚洲www永久成人夜色| 久久久久久久久久婷婷| 亚洲97在线观看| 国产精品十八以下禁看| 成人精品久久一区二区三区| 深夜成人在线观看| 欧美激情视频在线免费观看 欧美视频免费一| 中文字幕日韩在线视频|