定义:
#include <functional>
template< class F, class... Args>
std::invoke_result_t<F, Args...>
invoke(F&& f, Args&&... args) noexcept(/* see below */); (C++17起,C++20前)
template< class F, class... Args>
constexpr std::invoke_result_t<F, Args...>
invoke(F&& f, Args&&... args) noexcept(/* see below */); (C++20起)
以参数 f 调用可调用 (Callable) 对象。如同以 INVOKE(std::forward<F>(f), std::forward<Args>(args)...)
。
参数:
- f - 要调用的可调用 (Callable) 对象
- args - 传递给 f 的参数
异常:
noexcept(std::is_nothrow_invocable_v<F, Args...>)
参阅:
#include <functional>
#include <iostream>
struct Foo {
Foo(int num) : num_(num) {}
void print_add(int i) const { std::cout << num_+i << '\n'; }
int num_;
};
void print_num(int i)
{
std::cout << i << '\n';
}
struct PrintNum {
void operator()(int i) const
{
std::cout << i << '\n';
}
};
int main()
{
// 调用自由函数
std::invoke(print_num, -9);
// 调用 lambda
std::invoke([]() { print_num(42); });
// 调用成员函数
const Foo foo(314159);
std::invoke(&Foo::print_add, foo, 1);
// 调用(访问)数据成员
std::cout << "num_: " << std::invoke(&Foo::num_, foo) << '\n';
// 调用函数对象
std::invoke(PrintNum(), 18);
}