0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

function与invoke的区别

程序喵大人 来源:程序喵大人 2023-04-27 15:13 次阅读

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

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

#include 
#include 


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 
#include 


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 则适用于统一调用各种不同类型的可调用对象的场景。


审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Function
    +关注

    关注

    0

    文章

    14

    浏览量

    9912
  • 封装器
    +关注

    关注

    0

    文章

    7

    浏览量

    5873
  • invoke
    +关注

    关注

    0

    文章

    4

    浏览量

    1999

原文标题:function与invoke的区别

文章出处:【微信号:程序喵大人,微信公众号:程序喵大人】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    转载---verilog中task和function区别

    本帖最后由 hxing 于 2014-3-13 22:25 编辑 task--- 任务function --- 函数任务可以有input、output和inout,数量不限;函数只有input
    发表于 03-13 21:53

    Database Connectivity Toolkit 工具包里面Fetch Element Data VI 和Variant To Data Function区别

    我是新手,在看数据库方面的程序,自己理解要读取数据库中的数据要通过Variant To Data Function转换才能显示,可是参考例子中Fetch Element Data VI也可以自己用来
    发表于 07-16 14:22

    LabVIEW Property Node 及 Invoke Node 教学

    大家一起来学习Property Node及Invoke Node
    发表于 08-26 15:52

    MegaCore Function User Guide

    MegaCore Function User Guide 好东西哦。网上搜集,希望对你有用。
    发表于 03-25 15:32 36次下载

    MATLAB的S-Function编写指导

    S-Function(系统函数)为扩展Simulink®的性能提供了一个有力的工具。以下下节阐述了什么是S-Function,为什么可以使用S-Function,以及怎样编写自己的S-
    发表于 08-16 16:39 146次下载

    换向机能 Reversal Function

    换向机能 Reversal Function 5.3.1.1  换向阀的“通”和“位” “通”(Port)和“位”(Position)是换向阀的重要概
    发表于 10-25 14:58 1507次阅读
    换向机能 Reversal <b class='flag-5'>Function</b>

    什么是Function Keys

    什么是Function Keys  功能键。标有F1到F12的键,用于通知计算机执行某项功
    发表于 01-22 14:07 1097次阅读

    Mathematical_Function电路设计

    Mathematical Function电路设计
    发表于 01-11 17:41 0次下载

    形似亚马逊Echo:哈曼卡顿Cortana智能音箱Invoke预计8月份上市

    在今年5月份,微软和哈曼卡顿联合研制的Cortana智能音箱Invoke最终发布,官网介绍到,使用Invoke,用户将能通过Skype拨打和接听电话,支持语音控制音乐播放和Cortana语音助手。
    发表于 07-10 09:51 1033次阅读

    C++ function威廉希尔官方网站 的实现与具体运用

    当std::function对象没有初始化任何实际的可调用元素,调用std::function对象将抛出std::bad_function_call异常。
    的头像 发表于 01-20 09:23 3374次阅读

    在Java方法中调用Lua function

    Java先载入login.lua脚本并编译,然后再获取指定名称的函数,无参的直接使用call()方法调用,带参的需要通过invoke(LuaValue[])传入参数表。
    的头像 发表于 09-07 10:47 1400次阅读

    Simulink Function模块竟然可以这样测

    本文介绍了使用TPT测试Simulink Function模块的两种方案,TPT还支持MATLAB Function的测试。
    的头像 发表于 08-04 14:41 1370次阅读
    Simulink <b class='flag-5'>Function</b>模块竟然可以这样测

    C++ invokefunction区别在哪?

    invoke是C++17标准引入的一个函数模板,用来调用可调用对象(Callable Object,如函数指针、函数对象、成员函数指针等)并返回结果。
    的头像 发表于 09-04 09:11 831次阅读
    C++ <b class='flag-5'>invoke</b>与<b class='flag-5'>function</b>的<b class='flag-5'>区别</b>在哪?

    verilog中function和task的区别

    非常相似,但它们在功能和使用方式上有一些重要的区别。 定义和声明方式不同: Function:使用关键字"function"来定义和声明。函数可以有一个或多个输入参数,可以有一个返回值。函数必须在声明之后直接定义,不能在其他函数
    的头像 发表于 02-22 15:40 1909次阅读

    verilog task和function区别

    verilog中的task和function都是用于实现模块中的可重复的功能,并且可以接收参数和返回结果。但是它们在编写和使用上有一些区别。下面将详细介绍task和function区别
    的头像 发表于 02-22 15:53 1091次阅读