博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ invoke apply
阅读量:6715 次
发布时间:2019-06-25

本文共 1712 字,大约阅读时间需要 5 分钟。

Callable对象,是任何可以调用的东西。函数指针,函数,重载了operator()的对象,lamda

#include 
#include
#include
#include
struct S{ int f1(char c){ std::cout << "S::f1 called\n"; } void operator()(char c){ std::cout << "S::operator() called\n"; }};int main(){ int (S::*fptr)(char c) = &S::f1; S obj; (obj.*fptr)('a'); S* pobj = &obj; (pobj->*fptr)('a'); obj('a');}

在模板编程实践中,经常做调用转发,例如:

template< class Callable, typename ... Args>void dosomething( Callable f, Args... args){    f(args...);  }void foo(char c){    std::cout << "foo called\n" ;}int main(){    dosomething(foo,'c');  //调用了 foo('c');}

但是,F(args...)只能应付普通函数,和重载operator()的对象。如果F是函数指针,就挂了。std::invoke就是一个utility类,帮助解决这个大问题的。

template< class Callable, typename ... Args>void dosomething( Callable f, Args... args){    //f(args...);   //应用范围太窄, 对于成员函数指针,需要 (arg1.*f)(args...); 其中,arg1应从args中提取首个参数    std::invoke(f,args...); //ok 已经处理好一切}void foo(char c){    std::cout << "foo called\n" ;}int main(){    int (S::*fptr)(char c) = &S::f1;    S  obj;        dosomething(fptr, obj, 'a');}

 参考:

https://kelvinh.github.io/blog/2014/03/27/cpp-tutorial-pointer-to-member-function/

https://stackoverflow.com/questions/46388524/when-to-use-stdinvoke-instead-of-simply-calling-the-invokable

std::apply功能上类似std::invoke,Callable参数由tuple提供: 

#include 
#include
int add(int a,int b){ return a+b;}int main(){ std::cout << std::apply(add, std::make_pair(1, 2)) << '\n';}

 

另外还有一个未来的更强大的调用转发函数:std:call

参考:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0376r0.html

 

转载于:https://www.cnblogs.com/thomas76/p/8619297.html

你可能感兴趣的文章
AD软件原理图封装过程(即由原理图转换到PCB)
查看>>
cocos2d-x lua table与json的转换
查看>>
mysql的基本原理
查看>>
《面向对象分析与设计》——抽象
查看>>
linux学习记录-------jdk安装配置
查看>>
查看dll依赖项
查看>>
ansible普通用户su切换问题
查看>>
2017.10.1
查看>>
洛谷——P1187 3D模型
查看>>
温度传感器,ds18b20
查看>>
ecshop为什么删不掉商品分类
查看>>
bzoj1941[Sdoi2010]Hide and Seek
查看>>
IT兄弟连 Java Web教程 经典面试题2
查看>>
利用setTimeoutc处理javascript ajax请求超时
查看>>
三、Java基础工具(1)_常用类——字符串
查看>>
文献管理与信息分析》第二讲作业
查看>>
java 遍历arrayList的四种方法
查看>>
根据不同的产品id获得不同的下拉选项 (option传多值)
查看>>
css3新增属性:多列(column)
查看>>
redis 主从配置和集群配置
查看>>