中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中如何轉發一個函數調用

發布時間:2021-08-06 09:26:21 來源:億速云 閱讀:186 作者:小新 欄目:編程語言

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

方法如下

首先你靈光一閃:

#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++中如何轉發一個函數調用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

清水县| 连南| 梅州市| 威信县| 昌平区| 彰武县| 泰州市| 聂荣县| 台湾省| 庆阳市| 阳朔县| 无棣县| 兴隆县| 武宣县| 同德县| 南昌市| 绥江县| 巴马| 泰州市| 丹阳市| 六枝特区| 克山县| 横峰县| 琼海市| 邻水| 榆中县| 桃江县| 象州县| 栾川县| 连云港市| 法库县| 衡水市| 宁都县| 东乡县| 嘉兴市| 九龙城区| 宜君县| 上思县| 茶陵县| 府谷县| 商城县|