C++中如何轉發一個函數調用-創新互聯

這篇文章給大家分享的是有關C++中如何轉發一個函數調用的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

我們提供的服務有:網站設計、成都做網站、微信公眾號開發、網站優化、網站認證、福安ssl等。為上千家企事業單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的福安網站制作公司

方法如下

首先你靈光一閃:

#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返回值實際上會有參數被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)...);
}

但是上面的函數不是SFINAE-friendly的,因為decltype(auto)返回值的函數并不能直接從函數簽名獲得返回值,而對這個函數進行返回值推導,是可能產生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)...);
}

感謝各位的閱讀!關于“C++中如何轉發一個函數調用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

另外有需要云服務器可以了解下創新互聯建站m.kartarina.com,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

網頁名稱:C++中如何轉發一個函數調用-創新互聯
當前地址:http://m.kartarina.com/article38/dicgsp.html

成都網站建設公司_創新互聯,為您提供面包屑導航企業建站、網站設計公司域名注冊、App設計、手機網站建設

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

h5響應式網站建設
主站蜘蛛池模板: 久久午夜无码鲁丝片直播午夜精品| 国产莉萝无码AV在线播放| 无码欧精品亚洲日韩一区夜夜嗨 | 亚洲国产精品无码观看久久| 日韩av片无码一区二区三区不卡 | 人妻无码αv中文字幕久久 | 亚洲av纯肉无码精品动漫| 成年轻人电影www无码| 十八禁视频在线观看免费无码无遮挡骂过 | 无码少妇一区二区| 亚洲AV无码成人网站在线观看| r级无码视频在线观看| 免费A级毛片无码A∨中文字幕下载| 无码av高潮喷水无码专区线| 无码人妻精品一区二区三区久久| 国精品无码一区二区三区在线蜜臀| 久久亚洲AV成人无码国产 | 中文字幕人成无码人妻综合社区| 亚洲毛片av日韩av无码| 2019亚洲午夜无码天堂| 亚洲一区二区三区AV无码| 国产午夜精华无码网站| 成人免费无码大片A毛片抽搐色欲| 亚洲av无码不卡久久| 亚洲人片在线观看天堂无码| 一本大道无码日韩精品影视| 亚洲av无码一区二区三区四区| 欧洲人妻丰满av无码久久不卡| 亚洲中文字幕无码一区二区三区| 无码专区HEYZO色欲AV| 无码一区18禁3D| 无码无套少妇毛多18PXXXX| 18禁免费无码无遮挡不卡网站| 亚洲av无码国产精品夜色午夜| 亚洲熟妇无码八AV在线播放| 国产色爽免费无码视频| a级毛片无码免费真人久久 | 日韩AV高清无码| 中文字幕无码AV波多野吉衣| 国产成人无码综合亚洲日韩| 无码人妻精品一区二区三区99仓本 |