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

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

3天内不再提示

C++ invoke与function的区别在哪?

程序喵大人 来源:程序喵大人 2023-09-04 09:11 次阅读

C++ invoke

invoke是C++17标准引入的一个函数模板,用来调用可调用对象(Callable Object,如函数指针、函数对象、成员函数指针等)并返回结果。

invoke提供了统一的调用语法,无论可调用对象的类型是什么,都可以使用同一种方式进行调用。

b22b07da-4aba-11ee-97a6-92fbcf53809c.png

在C++17之前,调用不同类型的可调用对象需要使用不同的语法,比如直接调用函数、使用类对象的运算符重载操作符()来调用函数对象、使用成员函数指针来调用类成员函数等等。这些调用方式虽然能用,但是不够灵活,而invoke解决了这种不一致的问题。

invoke函数的实现原理是通过使用SFINAE(Substitution Failure Is Not An Error)技术来判断可调用对象的类型,并根据类型调用对应的调用方式。因此,无论可调用对象的类型是什么,都可以使用invoke函数来调用,而不需要使用不同的语法。

下面是invoke的示例代码:

#include 
#include 


void foo(int a, int b)
{
    std::cout << "a + b = " << a + b << std::endl;
}


class Bar
{
public:
    void operator()(int a, int b)
{
        std::cout << "a - b = " << a - b << std::endl;
    }
};


int main()
{
    int a = 10, b = 5;
    std::invoke(foo, a, b); // 调用普通函数
    Bar bar;
    std::invoke(bar, a, b); // 调用函数对象
    std::invoke(&Bar::operator(), bar, a, b); // 调用成员函数
    std::function f = foo;
    std::invoke(f, a, b); // 调用std::function对象
    return 0;
}

总结:std::invoke 提供了一种通用的函数调用语法,可以方便地调用各种可调用对象。

function与invoke的区别

std::function和std::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 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::function和std::invoke的使用场景是不同的。std::function 适用于需要存储可调用对象的场景,而std::invoke则适用于统一调用各种不同类型的可调用对象的场景。





审核编辑:刘清

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

    关注

    38

    文章

    7154

    浏览量

    162041
  • C++语言
    +关注

    关注

    0

    文章

    146

    浏览量

    6878
  • 封装器
    +关注

    关注

    0

    文章

    7

    浏览量

    5831

原文标题:C++ invoke与function的区别

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

收藏 人收藏

    评论

    相关推荐

    树莓派和香蕉派的区别在哪

    树莓派和香蕉派到底有什么区别?国产还是英产的区别?就算山寨也有山寨的区别,如果不是山寨那到的区别在哪
    发表于 03-12 14:49

    请问REV C和REV B的版本区别在哪里?

    REV C 和REV B的版本区别在哪里?
    发表于 08-22 06:39

    模拟地与信号地的区别在哪里?

    模拟地与信号地的区别在哪里?在复杂混合信号PCB设计中有哪些注意事项?
    发表于 04-23 06:19

    TDD与FDD的区别在哪里?

    TDD与FDD的区别在哪里?TD-SCDMA系统优势有哪些?
    发表于 05-25 06:03

    string类型数据与《string.h》头文件的区别在哪里?

    string的含义是什么?string与vector容器的区别在哪c中的字符串是什么?string类型数据与《string.h》头文件的区别在哪里?
    发表于 07-05 07:18

    数字舵机与模拟舵机的区别在哪

    舵机是什么?数字舵机的工作原理是什么?数字舵机与模拟舵机区别在哪
    发表于 07-13 06:16

    相电流和线电流的区别在哪

    什么是相电流?什么是线电流?相电流和线电流的区别在哪
    发表于 09-29 07:44

    JTAG和SWD的区别在哪

    JTAG和SWD的区别在哪?USART和UART的区别在哪
    发表于 10-08 09:01

    进程是什么?进程与程序的区别在哪

    进程是什么?进程与程序的区别在哪?进程的状态有哪几种?
    发表于 12-23 06:27

    sizeof和strlen函数的区别在哪

    野指针是指指针指向的位置是不可知的,主要成因是什么?sizeof和strlen函数的区别在哪?链表和数组的区别在哪
    发表于 12-24 07:19

    SoftMAC和FullMAC的区别在哪

    Wifi设备的协议栈是怎样的?SoftMAC和FullMAC的区别在哪呢?SoftMAC和FullMAC分别有哪些优势呢?
    发表于 03-10 08:00

    RTK和GPS定位的区别在哪里?

    RTK和GPS定位的区别在哪里?
    发表于 05-08 10:08 76次下载

    串口屏和并口屏的区别在哪

    串口屏还是并口屏好用?区别在哪里?
    的头像 发表于 01-23 09:53 8349次阅读

    functioninvoke区别

    std::function和std::invoke是两个不同的东西,功能也不同。std::function 是一个函数对象的封装器,可以用来封装任意类型的可调用对象,比如函数指针、lambda表达式等
    的头像 发表于 04-27 15:13 471次阅读

    梯形丝杆和滚珠丝杆的区别在哪里?

    梯形丝杆和滚珠丝杆的区别在哪里?
    的头像 发表于 03-28 17:48 1357次阅读
    梯形丝杆和滚珠丝杆的<b class='flag-5'>区别在哪</b>里?