中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

C++中如何轉發(fā)一個函數(shù)調(diào)用

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

目前創(chuàng)新互聯(lián)已為上1000+的企業(yè)提供了網(wǎng)站建設、域名、網(wǎng)頁空間、網(wǎng)站托管運營、企業(yè)網(wǎng)站設計、臨安網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

方法如下

首先你靈光一閃:

#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)...);
}

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

新聞名稱:C++中如何轉發(fā)一個函數(shù)調(diào)用
URL地址:http://www.rwnh.cn/article32/psjcpc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、手機網(wǎng)站建設、移動網(wǎng)站建設、電子商務、小程序開發(fā)關鍵詞優(yōu)化

廣告

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

成都做網(wǎng)站
桃源县| 青海省| 阿克| 调兵山市| 石家庄市| 阳谷县| 简阳市| 吐鲁番市| 和林格尔县| 鹤壁市| 承德县| 沂南县| 蕉岭县| 运城市| 汾阳市| 双柏县| 遂宁市| 武陟县| 黄大仙区| 龙江县| 临潭县| 秀山| 乌鲁木齐市| 泰和县| 平乐县| 普兰店市| 海南省| 吉隆县| 万安县| 文安县| 德安县| 介休市| 陆良县| 米脂县| 淮滨县| 珠海市| 宁晋县| 万年县| 东海县| 咸宁市| 文化|