国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 琼中| 衡阳县| 双柏县| 朝阳区| 漳州市| 胶南市| 资溪县| 白朗县| 荣成市| 铅山县| 陇西县| 方城县| 会泽县| 昔阳县| 永修县| 扶绥县| 托克逊县| 达尔| 横山县| 自治县| 和平县| 永定县| 陕西省| 荥经县| 富裕县| 金塔县| 德保县| 海淀区| 铜川市| 东莞市| 讷河市| 青冈县| 珲春市| 鲜城| 潜山县| 黔西| 南乐县| 卓尼县| 东乌珠穆沁旗| 莱阳市| 宜章县|