std::invoke
时间: 2024-05-23 07:08:07 浏览: 12
std::invoke是一个通用的函数调用工具,可以用于调用函数、成员函数和函数对象。它可以用于替代函数指针、成员函数指针和std::mem_fn等。在使用std::invoke时,它会根据传入参数的类型自动选择最合适的调用方式,从而让代码更加简洁。
如果传入的是一个函数指针或成员函数指针,std::invoke会直接调用该指针指向的函数或成员函数;如果传入的是一个可调用对象(如lambda表达式),std::invoke会调用该对象的operator()函数。
另外,std::invoke支持绑定参数(使用std::bind或者类似bind的库),从而可以在调用时指定部分参数。这对于某些需要动态生成参数的场景非常有用。
相关问题
cpp17的 std::invoke
std::invoke是C++17标准库中的一个新函数,用于调用函数或者函数对象。它可以方便地处理函数指针、成员函数指针和函数对象的调用,同时支持传递参数和返回值。
这个函数的语法如下:
template <typename F, typename... Args>
decltype(auto) invoke(F&& f, Args&&... args);
其中,F表示要调用的函数或函数对象,Args表示调用该函数时要传递的参数。
使用std::invoke的好处在于,它可以在不同的调用方式下,提供一致的语法和错误处理,使代码更加清晰易懂。例如:
// 调用普通函数
int add(int a, int b) { return a + b; }
int result1 = std::invoke(add, 1, 2);
// 调用成员函数
struct Foo {
int add(int a, int b) { return a + b; }
};
Foo foo;
int result2 = std::invoke(&Foo::add, foo, 1, 2);
// 调用函数对象
struct Bar {
int operator()(int a, int b) { return a + b; }
};
Bar bar;
int result3 = std::invoke(bar, 1, 2);
在上面的例子中,我们使用了std::invoke来调用普通函数、成员函数和函数对象,都使用了相同的语法,使代码更加简洁易懂。
std::invoke() 是什么
`std::invoke` 是 C++17 中的一个函数模板,它提供了一种通用的方式,可以调用任意可调用对象(函数、函数指针、成员函数、成员函数指针、函数对象等等)。它的语法如下:
```cpp
template< class F, class... Args >
constexpr /*see below*/ invoke_result_t<F, Args...> invoke( F&& f, Args&&... args );
```
其中,`F` 表示可调用对象的类型,`Args...` 表示可调用对象的参数类型,`f` 表示要调用的可调用对象,`args...` 表示传递给可调用对象的参数。
`std::invoke` 的返回值类型是 `invoke_result_t<F, Args...>`,这是一个 C++17 中新引入的类型特征符,它可以推导出可调用对象的返回值类型,具体的定义可以参考 C++17 标准。
`std::invoke` 的作用是简化代码,避免出现大量的重载和模板特化,使代码更加通用和简洁。