国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

C++ 17轉發(fā)一個函數(shù)調用的完美實現(xiàn)

2020-01-26 13:56:45
字體:
來源:轉載
供稿:網(wǎng)友

前言

本文主要給大家介紹了關于C++17轉發(fā)一個函數(shù)調用的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。

方法如下

首先你靈光一閃:

#define WARP_CALL(fun, ...) fun(__VA_ARGS__)

不我們并不喜歡宏,擴展性太差了

template<class R, class T1, class T2, class T3>R warp_call(R(*fun)(T1, T2, T3), T1 a, T2 b, T3 c){ return fun(a, b, c);}

如果你寫出來上面這段代碼,你肯定是從C轉過來的,C++還沒用熟。考慮callable object和C++11 variadic template特性用上:

template<class Fun, class... Args>auto wrap_call(Fun f, Args... args) -> decltype(f(args...)){ return f(args...);}

加上移動語義,返回值推導:

template<class Fun, class... Args>auto wrap_call(Fun&& f, Args&&... args){ return std::forward<Fun>(f)(std::forward<Args>(args)...);}

auto返回值實際上會有參數(shù)被decay的問題,用decltype + 尾置返回值

template<class Fun, class... Args>auto wrap_call(Fun&& f, Args&&... args) -> decltype(std::forward<Fun>(f)(std::forward<Args>(args)...)){ return std::forward<Fun>(f)(std::forward<Args>(args)...);}

有了C++14,可以直接使用decltype(auto)

template<class Fun, class... Args>decltype(auto) wrap_call(Fun&& f, Args&&... args){ return std::forward<Fun>(f)(std::forward<Args>(args)...);}

別忘了noexcept

template<class Fun, class... Args>decltype(auto) wrap_call(Fun&& f, Args&&... args) noexcept(noexcept(std::forward<Fun>(f)(std::forward<Args>(args)...))){ return std::forward<Fun>(f)(std::forward<Args>(args)...);}

但是上面的函數(shù)不是SFINAE-friendly的,因為decltype(auto)返回值的函數(shù)并不能直接從函數(shù)簽名獲得返回值,而對這個函數(shù)進行返回值推導,是可能產(chǎn)生hard error打斷SFINAE的。所以最好手動寫返回值

template<class Fun, class... Args>auto wrap_call(Fun&& f, Args&&... args) noexcept(noexcept(std::forward<Fun>(f)(std::forward<Args>(args)...))) -> decltype(std::forward<Fun>(f)(std::forward<Args>(args)...)){ return std::forward<Fun>(f)(std::forward<Args>(args)...);}

我們還遺漏了啥?constexpr

template<class Fun, class... Args>constexpr auto wrap_call(Fun&& f, Args&&... args) noexcept(noexcept(std::forward<Fun>(f)(std::forward<Args>(args)...))) -> decltype(std::forward<Fun>(f)(std::forward<Args>(args)...)){ return std::forward<Fun>(f)(std::forward<Args>(args)...);}

上面是完美的

完美嗎?去看看std::invoke

總結

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 和田县| 阿拉善盟| 中卫市| 苏州市| 南召县| 合山市| 政和县| 元江| 姚安县| 普宁市| 通州区| 井研县| 大安市| 靖安县| 云阳县| 温宿县| 策勒县| 台北市| 望江县| 原阳县| 垫江县| 龙海市| 和顺县| 巴马| 卢氏县| 翁牛特旗| 柏乡县| 柳州市| 西青区| 合水县| 京山县| 鄂伦春自治旗| 汝城县| 金湖县| 拜城县| 新和县| 巴楚县| 濮阳县| 富锦市| 达日县| 郓城县|