以下都是chatGPT的答复,如有侵权请联系删除!
std::invoke
是 C++17 中引入的新特性。它位于 <functional>
头文件中,用于以一种统一的方式调用函数或者函数对象。
在 C++17 之前,要实现 std::invoke
的功能,可能需要使用函数指针、成员函数指针、函数对象以及 std::bind
等多种方法,代码会相对冗长和复杂。引入 std::invoke
可以简化这些代码,并提供了一种更加统一和通用的调用方式。
因此,如果要使用 std::invoke
,需要在支持 C++17 的编译器和标准库中进行编译和运行
std::invoke
和 std::function
是 C++ 标准库中的两个不同的组件,它们分别用于不同的目的,但有时也可以结合使用。
-
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; }
-
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
用于存储可调用对象并提供统一的调用接口。两者可以根据具体的需求和场景选择使用。