时间:2021-05-20
前言
本文主要给大家介绍了关于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
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本教程将介绍如何在Lua里面调用c/c++函数。在Lua里面调用c/c++函数其实是比较简单,本文将通过两个示例演示具体的做法:一个是求平均数,另一个是打印lu
定义我们知道函数的重载可以实现一个函数名多用,将功能相同或者类似函数用同一个名来定义。这样可以简化函数的调用形式,但是程序中,仍然需要分别定义每一个函数。C++
原则:1、函数指针,实际上是函数编码后的指令在内存中的首地址,在C++/C中,这个地址可以用函数名直接使用一个函数调用另一个函数的时候,就可以把被调用函数以函数
问题:程序模型用C++语言编写,在程序模型和调用函数之间添加了一个接口文件modelc.cpp,用来让用c语言程序调用程序模型中的函数;新添加了两个函数setP
首先c++里的各种运算符都是用函数实现的,比如=,就等号函数。所以当用=给一个对象赋值的时候,实际调用的是=号所对应的=号函数。分析下面的代码#includeu