一文弄懂function与invoke的区别

新闻资讯   2023-06-07 12:05   68   0  

std::functionstd::invoke是两个不同的东西,功能也不同。std::function 是一个函数对象的封装器,可以用来封装任意类型的可调用对象,比如函数指针、lambda表达式等,而 std::invoke 则是一个函数模板,用于在统一的接口下调用可调用对象。

比如,我们可以使用 std::function 来存储一个函数指针:

#include <functional>#include <iostream>
void foo(int a, int b){ std::cout << "foo(" << a << ", " << b << ")" << std::endl;}
int main(){ std::function<void(int, int)> f = foo; f(1, 2);}

上述代码中,我们将函数指针 foo 封装成了一个 std::function 对象 f,然后通过调用 f(1, 2) 来调用函数 foo

std::invoke 的作用是提供一种通用的函数调用语法,可以用统一的方式来调用各种可调用对象,而不必关心它们具体是什么类型。

比如,可以使用 std::invoke 来调用一个东西,无论这个东西是函数指针、函数对象还是成员函数指针:

#include <functional>#include <iostream>
void foo(int a, int b){ std::cout << "foo(" << a << ", " << b << ")" << std::endl;}
class Bar {public: void bar(int a, int b) const{ std::cout << "Bar::bar(" << a << ", " << b << ")" << std::endl; }};
int main(){ std::invoke(foo, 1, 2);
Bar b; std::invoke(&Bar::bar, &b, 1, 2);}

上面代码,使用 std::invoke 分别调用了函数 foo 和类 Bar 的成员函数 bar,并传递了相应的参数。

总结,std::functionstd::invoke 的使用场景是不同的。std::function 适用于需要存储可调用对象的场景,而 std::invoke 则适用于统一调用各种不同类型的可调用对象的场景。

END

来源:程序喵大人

版权归原作者所有,如有侵权,请联系删除。

推荐阅读
CAN总线比UART串口难吗?
分享一个开源串口神器,太强了!
一文讲透CRC校验码(附C语言实例)

→点关注,不迷路←

文章引用微信公众号"嵌入式微处理器",如有侵权,请联系管理员删除!

博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。