【C++基础概念理解——std::invoke()函数基础知识】
std::invoke定义
std::invoke
是 C++17
引入的一个标准库函数,用于通用地调用可调用对象(如函数指针、成员函数指针、函数对象、lambda 表达式
等)。它提供了一种统一的方式来调用这些可调用对象,而不需要关心它们的具体类型。
功能
std::invoke
可以调用以下类型的可调用对象:
-
普通函数和函数指针:
int func(int a) { return a; } std::invoke(func, 42); // 等价于 func(42)
-
成员函数指针:
struct Foo {int member_func(int a) { return a; } }; Foo foo; std::invoke(&Foo::member_func, foo, 42); // 等价于 foo.member_func(42)
-
成员变量指针:
struct Foo {int member_var; }; Foo foo{42}; std::invoke(&Foo::member_var, foo); // 等价于 foo.member_var
-
函数对象和 lambda 表达式:
auto lambda = [](int a) { return a; }; std::invoke(lambda, 42); // 等价于 lambda(42)
示例
以下是一些使用 std::invoke
的示例:
#include <iostream>
#include <functional>int func(int a) {return a;
}struct Foo {int member_func(int a) {return a;}int member_var;
};int main() {// 调用普通函数std::cout << std::invoke(func, 42) << std::endl; // 输出 42// 调用成员函数Foo foo;std::cout << std::invoke(&Foo::member_func, foo, 42) << std::endl; // 输出 42// 访问成员变量foo.member_var = 42;std::cout << std::invoke(&Foo::member_var, foo) << std::endl; // 输出 42// 调用 lambda 表达式auto lambda = [](int a) { return a; };std::cout << std::invoke(lambda, 42) << std::endl; // 输出 42return 0;
}
总结
std::invoke
提供了一种统一的方式来调用各种类型的可调用对象,使得代码更加简洁和通用。
std::invoke(std::forward<F>(f), **this);
用于调用传入的 lambda 函数或其他可调用对象,并将当前对象的值作为参数传递给它。