std::invoke 和 std::function区别

以下都是chatGPT的答复,如有侵权请联系删除!

std::invoke 是 C++17 中引入的新特性。它位于 <functional> 头文件中,用于以一种统一的方式调用函数或者函数对象。

在 C++17 之前,要实现 std::invoke 的功能,可能需要使用函数指针、成员函数指针、函数对象以及 std::bind 等多种方法,代码会相对冗长和复杂。引入 std::invoke 可以简化这些代码,并提供了一种更加统一和通用的调用方式。

因此,如果要使用 std::invoke,需要在支持 C++17 的编译器和标准库中进行编译和运行

std::invokestd::function 是 C++ 标准库中的两个不同的组件,它们分别用于不同的目的,但有时也可以结合使用。

  1. std::invoke

    • std::invoke 是一个函数模板,用于以一种统一的方式调用函数或者函数对象。
    • std::invoke 提供了一种通用的方法来调用各种可调用对象,包括普通函数、函数指针、成员函数、成员函数指针、函数对象(仿函数)以及 lambda 表达式等。
    • std::invoke 可以用于直接调用可调用对象,而不需要事先将其包装到 std::function 中。
    • 示例代码:
      #include <iostream>
      #include <functional>
      
      void foo(int x) {
          std::cout << "foo called with argument: " << x << std::endl;
      }
      
      class MyClass {
      public:
          void bar(int x) {
              std::cout << "MyClass::bar called with argument: " << x << std::endl;
          }
      };
      
      int main() {
          // 调用普通函数
          std::invoke(foo, 42);
      
          // 调用成员函数
          MyClass obj;
          std::invoke(&MyClass::bar, obj, 42);
      
          return 0;
      }
      

  2. std::function

    • std::function 是一个模板类,用于存储可调用对象,并提供一种统一的调用接口。
    • std::function 可以用来存储任何可调用对象,包括普通函数、函数指针、成员函数、成员函数指针、函数对象以及 lambda 表达式等。
    • std::function 提供了一种通用的封装器,可以在运行时存储和调用不同类型的可调用对象。
    • 示例代码:
      #include <iostream>
      #include <functional>
      
      void foo(int x) {
          std::cout << "foo called with argument: " << x << std::endl;
      }
      
      class MyClass {
      public:
          void bar(int x) {
              std::cout << "MyClass::bar called with argument: " << x << std::endl;
          }
      };
      
      int main() {
          // 存储普通函数
          std::function<void(int)> func1 = foo;
          func1(42);
      
          // 存储成员函数
          MyClass obj;
          std::function<void(int)> func2 = std::bind(&MyClass::bar, &obj, std::placeholders::_1);
          func2(42);
      
          return 0;
      }
      

综上所述,std::invoke 用于直接调用可调用对象,适用于统一调用各种不同类型的可调用对象的场景,而 std::function 用于存储可调用对象并提供统一的调用接口。两者可以根据具体的需求和场景选择使用。

  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值