前言

本文主要给大家介绍了关于C++17转发一个函数调用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
方法如下
首先你灵光一闪:
#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)...);
}
上面是完美的
完美吗?去看看std::invoke
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# c
# 函数调用
# 函数的调用
# 详解如何实现C++虚函数调用汇编代码
# 详解C++中的函数调用和下标以及成员访问运算符的重载
# C/C++函数调用栈的实现方法
# C/C++函数调用的几种方式总结
# 基于C++内存分配、函数调用与返回值的深入分析
# C和C++的函数调用约定你知道多少
# 返回值
# 会有
# 相关内容
# 说了
# 不多
# 是从
# 这段
# 给大家
# 可以直接
# 这篇文章
# 并不能
# 别忘了
# 谢谢大家
# 而对
# 差了
# 你写
# 方法如下
# 一个函数
# 有疑问
# fun
相关文章:
油猴 教程,油猴搜脚本为什么会网页无法显示?
制作电商网页,电商供应链怎么做?
清除minerd进程的简单方法
如何撰写建站申请书?关键要点有哪些?
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
建站主机数据库如何配置才能提升网站性能?
如何通过宝塔面板实现本地网站访问?
如何快速建站并高效导出源代码?
宁波免费建站如何选择可靠模板与平台?
如何零成本快速生成个人自助网站?
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
php json中文编码为null的解决办法
建站ABC备案流程中有哪些关键注意事项?
建站之星导航配置指南:自助建站与SEO优化全解析
如何高效完成独享虚拟主机建站?
盐城做公司网站,江苏电子版退休证办理流程?
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
,南京靠谱的征婚网站?
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
Android使用GridView实现日历的简单功能
内部网站制作流程,如何建立公司内部网站?
如何在IIS7中新建站点?详细步骤解析
企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?
免费视频制作网站,更新又快又好的免费电影网站?
如何在万网开始建站?分步指南解析
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
电商平台网站制作流程,电商网站如何制作?
如何通过虚拟机搭建网站?详细步骤解析
网站制作公司排行榜,四大门户网站排名?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
如何配置IIS站点权限与局域网访问?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
常州企业网站制作公司,全国继续教育网怎么登录?
如何生成腾讯云建站专用兑换码?
建站之星安装路径如何正确选择及配置?
GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
如何做静态网页,sublimetext3.0制作静态网页?
建站之星上传入口如何快速找到?
英语简历制作免费网站推荐,如何将简历翻译成英文?
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
公司门户网站制作流程,华为官网怎么做?
网站企业制作流程,用什么语言做企业网站比较好?
北京的网站制作公司有哪些,哪个视频网站最好?
黑客如何利用漏洞与弱口令入侵网站服务器?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
专业网站建设制作报价,网页设计制作要考什么证?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
*请认真填写需求信息,我们会在24小时内与您取得联系。