On this page
std::invoke, std::invoke_r
Defined in header <functional> |
||
---|---|---|
(1) | ||
|
(since C++17) (until C++20) |
|
|
(since C++20) | |
|
(2) | (since C++23) |
1) Invoke the Callable object
f
with the parameters args
as by INVOKE(std::forward<F>(f), std::forward<Args>(args)...)
. This overload participates in overload resolution only if std::is_invocable_v<F, Args...>
is true
.
2) Invoke the Callable object
f
with the parameters args
as by INVOKE<R>(std::forward<F>(f), std::forward<Args>(args)...)
. This overload participates in overload resolution only if std::is_invocable_r_v<R, F, Args...>
is true
.
Parameters
f | - | Callable object to be invoked |
args | - | arguments to pass to f |
Return value
1) The value returned by
f
.
2) The value returned by
f
, implicitly converted to R
, if R
is not void
. None otherwise.
Exceptions
1)
noexcept
specification:
noexcept(std::is_nothrow_invocable_v<F, Args...>)
2)
noexcept
specification:
noexcept(std::is_nothrow_invocable_r_v<R, F, Args...>)
Possible implementation
invoke |
---|
|
invoke_r |
|
Notes
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_invoke |
201411L | (C++17) | std::invoke |
__cpp_lib_invoke_r |
202106L | (C++23) | std::invoke_r |
Example
#include <functional>
#include <iostream>
#include <type_traits>
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()
{
// invoke a free function
std::invoke(print_num, -9);
// invoke a lambda
std::invoke([]() { print_num(42); });
// invoke a member function
const Foo foo(314159);
std::invoke(&Foo::print_add, foo, 1);
// invoke (access) a data member
std::cout << "num_: " << std::invoke(&Foo::num_, foo) << '\n';
// invoke a function object
std::invoke(PrintNum(), 18);
#if defined(__cpp_lib_invoke_r)
auto add = [](int x, int y) { return x + y; };
auto ret = std::invoke_r<float>(add, 11, 22);
static_assert(std::is_same<decltype(ret), float>());
std::cout << ret << '\n';
std::invoke_r<void>(print_num, 44);
#endif
}
Possible output:
-9
42
314160
num_: 314159
18
33
44
See also
(C++11)
|
creates a function object out of a pointer to a member (function template) |
(C++11)(removed in C++20)(C++17)
|
deduces the result type of invoking a callable object with a set of arguments (class template) |
(C++17)
|
checks if a type can be invoked (as if by std::invoke ) with the given argument types (class template) |
(C++17)
|
calls a function with a tuple of arguments (function template) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/functional/invoke