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

首頁 > 編程 > C++ > 正文

C++ 11實現檢查是否存在特定的成員函數

2020-01-26 14:14:31
字體:
來源:轉載
供稿:網友

問題提出

最近工作中遇到這樣一個需求:實現一個ToString函數將類型T轉換到字符串,如果類型T中含有同名方法ToString則直接調用。

這樣一個ToString實現可以使用std::enable_if來做到,但是這里的難點在于如何判斷類型T中存在這樣一個ToString方法,以便可以放入enable_if中做SFINAE。

檢查類中是否存在特定成員

相同的問題在知乎上有人提出過,@孫明琦的答案提供了一個用于檢測特定檢測子U在類型T下是否有效的檢測器is_detected_v。其中用到了一個C++17的std::void_t,考慮到目前C++17還沒得用,這個實現只作參考之用(事實上C++17自帶了一個這樣的檢測器,并不需要自己寫這樣的模板)。

經人提醒,我參考了下標準庫在實現swap上做的努力,看到了這樣的寫法:

namespace __swappable_details { using std::swap;  struct __do_is_swappable_impl {  template <typename _Tp, typename    = decltype(swap(std::declval<_Tp&>(), std::declval<_Tp&>()))>  static true_type __test(int);   template <typename>  static false_type __test(...); };} template <typename _Tp>struct __is_swappable_impl : public __swappable_details::__do_is_swappable_impl{ typedef decltype(__test<_Tp>(0)) type;}; template <typename _Tp>struct __is_swappable : public __is_swappable_impl<_Tp>::type{};

簡單分析可以看到__is_swappable被用來檢查是否存在一個swap函數接受T作為參數,很有趣的是__test函數,如果存在swap函數滿足條件,那么test(int)這個重載版本就會被選中。而如果不滿足條件,因為推導失敗就剩下了test(…)這個版本。通過這一手段,再設置下返回值分別為truefalse,就實現了這樣的一個檢測過程。

按圖索驥,檢查是否存在成員ToString的模板就可以這么寫:

namespace details{ struct HasMemberToStringValidator {  template <typename T, typename = decltype(&T::ToString)>  static std::true_type Test(int);   template <typename>  static std::false_type Test(...); };} template <typename T>struct HasMemberToString : public decltype(details::HasMemberToStringValidator::Test<T>(0)){};

HasMemberToString::value就是T中是否存在該成員的計算結果。

檢測是否存在特定成員函數

但是上述代碼有個問題,如果類T中的ToString是個成員變量,上述檢測也會返回true。

解決這一問題的手段是去調用T::ToString,如果這個ToString可以被調用并能生成返回值,就認為這是個成員函數(嚴謹的講,這個過程是確認T::ToString是callable的,但是callable的玩意不一定就是成員函數,然而實際使用并不需要這樣細分)。

這里的另一個問題是,因為ToString是成員函數,那么decltype(T::ToString())這種手段就行不通了,因為成員函數必須帶對象進行調用。既然必須要一個對象,那么這里的解決方法就是用上declval來產生一個對象,再用decltype獲取返回值類型。

按照這個思路,驗證過程被改動成:

struct HasMemberToStringValidator{ template <typename T, typename U =  typename std::decay<decltype(std::declval<T>().ToString())>::type,  typename = typename std::enable_if<std::is_same<std::string, U>::value>::type> static std::true_type Test(int);  template <typename> static std::false_type Test(...);};

這個升級版本除了能檢查是否存在成員函數ToString以外還對返回值做了限定,確保返回的是string。以此類推,還能檢查返回是否是u16string、u32string。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产精品久久91精品| 久久久91精品国产一区不卡| 91精品国产高清久久久久久久久| 国产精品网红福利| 日韩电影中文 亚洲精品乱码| 亚洲国产中文字幕久久网| 亚洲成人网在线| 在线视频日韩精品| 欧美性高跟鞋xxxxhd| 欧美一级片久久久久久久| 中文字幕九色91在线| 91精品视频在线看| 欧美在线亚洲在线| 国产精品久久久久久久美男| 国产精品久久久久久久7电影| 日韩久久午夜影院| 色先锋资源久久综合5566| 国产精品久久久久久久久免费| 久久久www成人免费精品张筱雨| 亚洲欧美日韩一区在线| 亚洲欧美国产视频| 亚州精品天堂中文字幕| 亚洲影院高清在线| 精品国产福利在线| 日韩电影在线观看永久视频免费网站| 欧美性猛交xxxxx水多| 国产成人欧美在线观看| 国产丝袜一区二区三区| 两个人的视频www国产精品| 亚洲视频日韩精品| 日韩av手机在线| 中文字幕亚洲一区二区三区五十路| y97精品国产97久久久久久| 日韩视频免费大全中文字幕| 亚洲电影中文字幕| 97在线看免费观看视频在线观看| 亚洲最大的av网站| 国产91九色视频| 91久久久久久国产精品| 欧美国产日韩一区| 亚洲最大福利视频网站| 日本中文字幕不卡免费| 日韩成人在线视频网站| 欧美激情xxxx| 国产精品中文久久久久久久| 97精品视频在线观看| 欧美激情伊人电影| 国产精品成人一区二区| 韩日精品中文字幕| 日韩高清电影好看的电视剧电影| 一区二区三区国产在线观看| 日韩中文字幕视频| 97视频在线看| 亚洲自拍另类欧美丝袜| 国产精品男人的天堂| zzjj国产精品一区二区| 亚洲国产精品嫩草影院久久| 一个人看的www欧美| 国产精品久久久久久久7电影| 成人精品视频在线| 亚洲国产高清福利视频| 国产91成人在在线播放| 亚洲视频免费一区| 中文字幕在线看视频国产欧美在线看完整| 欧美专区在线观看| 国产又爽又黄的激情精品视频| 精品久久久久人成| 久久久噜噜噜久噜久久| 亚洲视频在线观看网站| 88国产精品欧美一区二区三区| 欧美专区中文字幕| 亚洲欧美激情精品一区二区| 亚洲自拍欧美色图| 爱福利视频一区| 精品无人区太爽高潮在线播放| 国产欧美最新羞羞视频在线观看| 欧美超级乱淫片喷水| 亚洲女人天堂视频| 懂色av影视一区二区三区| 91免费电影网站| 国产欧美日韩精品专区| 日韩欧美在线观看| 亚洲美女av电影| 亚洲电影第1页| 日韩精品久久久久久福利| 国产亚洲精品一区二区| 亚洲人成在线免费观看| 国产精品高清在线观看| 亚洲精品福利视频| 欧美与黑人午夜性猛交久久久| 992tv成人免费影院| 最近2019中文字幕mv免费看| 91免费精品视频| 色综合久久悠悠| 欧美激情一区二区三级高清视频| 日韩经典中文字幕在线观看| 亚洲欧洲成视频免费观看| 国产精品视频免费观看www| 国产在线a不卡| 中文字幕精品www乱入免费视频| 国产91对白在线播放| 欧美日韩在线看| 亚洲一区二区三| 国产精品久久久久久一区二区| 久久精品美女视频网站| 欧美野外wwwxxx| 97国产在线观看| 欧美丰满少妇xxxxx| 丝袜美腿亚洲一区二区| 久久精品最新地址| xxxxxxxxx欧美| 国产亚洲精品久久久久久777| 亚洲精品www久久久久久广东| 欧美成人性色生活仑片| 91国在线精品国内播放| 精品国产乱码久久久久久虫虫漫画| 久久久久久国产精品| 亚洲精品久久7777777| 久久久久国产精品www| 国产精品久久久久久久久久久不卡| 亚洲精品国产精品国自产观看浪潮| 国产网站欧美日韩免费精品在线观看| 人人做人人澡人人爽欧美| 国产精品久久久亚洲| 色噜噜亚洲精品中文字幕| 91wwwcom在线观看| 国产精品免费久久久| 欧美大片在线影院| 国语自产精品视频在线看一大j8| 日韩有码在线电影| 亚洲老司机av| 国产福利精品视频| 一区二区成人精品| 欧洲一区二区视频| 亚洲激情视频网| 国产精品自产拍在线观看| 日韩高清av在线| 国产69精品久久久久久| 欧美日韩国产成人高清视频| 日韩中文在线中文网在线观看| 欧美一二三视频| 中文字幕国产日韩| 国产免费亚洲高清| 国产欧美va欧美va香蕉在| 91在线国产电影| 亚洲国产美女久久久久| 欧美一区二区三区图| 久久久久国色av免费观看性色| 欧美成人剧情片在线观看| 色yeye香蕉凹凸一区二区av| xxx一区二区| 91久久国产精品91久久性色| 国产福利成人在线| 欧美视频中文字幕在线| 国产精品精品视频一区二区三区| 日韩精品免费综合视频在线播放| 日韩激情在线视频| 两个人的视频www国产精品| 91国产精品视频在线| 韩剧1988免费观看全集| 日韩av在线免费观看一区| 日韩国产精品视频| 日韩国产一区三区| 亚洲最大成人在线|