全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++ 17转发一个函数调用的完美实现

前言

本文主要给大家介绍了关于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小时内与您取得联系。