前言

本文主要给大家介绍了关于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
相关文章:
建站之星安装后如何自定义网站颜色与字体?
如何在阿里云通过域名搭建网站?
网站制作服务平台,有什么网站可以发布本地服务信息?
建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
宝塔建站后网页无法访问如何解决?
如何基于PHP生成高效IDC网络公司建站源码?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
如何在西部数码注册域名并快速搭建网站?
建站之星logo尺寸如何设置最合适?
,在苏州找工作,上哪个网站比较好?
英语简历制作免费网站推荐,如何将简历翻译成英文?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
如何用好域名打造高点击率的自主建站?
如何在阿里云完成域名注册与建站?
如何在企业微信快速生成手机电脑官网?
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
如何使用Golang安装API文档生成工具_快速生成接口文档
太平洋网站制作公司,网络用语太平洋是什么意思?
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
教程网站设计制作软件,怎么创建自己的一个网站?
建站之家VIP精选网站模板与SEO优化教程整合指南
建站之星安装需要哪些步骤及注意事项?
建站之星×万网:智能建站系统+自助建站平台一键生成
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
免费视频制作网站,更新又快又好的免费电影网站?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
相册网站制作软件,图片上的网址怎么复制?
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
如何用IIS7快速搭建并优化网站站点?
建站之星在线版空间:自助建站+智能模板一键生成方案
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
,南京靠谱的征婚网站?
杭州银行网站设计制作流程,杭州银行怎么开通认证方式?
山东云建站价格为何差异显著?
音响网站制作视频教程,隆霸音响官方网站?
如何高效完成自助建站业务培训?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
如何有效防御Web建站篡改攻击?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
如何在阿里云虚拟主机上快速搭建个人网站?
宝塔建站助手安装配置与建站模板使用全流程解析
如何快速搭建自助建站会员专属系统?
无锡营销型网站制作公司,无锡网选车牌流程?
如何快速搭建高效WAP手机网站吸引移动用户?
如何快速搭建个人网站并优化SEO?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
定制建站是什么?如何实现个性化需求?
官网建站费用明细查询_企业建站套餐价格及收费标准指南
*请认真填写需求信息,我们会在24小时内与您取得联系。