C++ 中的 std::invoke 是什么?
What is std::invoke in c++?
我刚刚阅读了有关 std::thread
和 std::bind
的文章,其中我遇到了 Callable
概念和 std::invoke
。
我在 cppreference 上看到了关于 std::invoke
的内容,但我不明白它说的是什么。这是我的问题:
std::invoke
、std::function
、std::bind
和Callable
是什么概念?他们之间是什么关系?
std::invoke
接受一些可调用的东西,以及调用它的参数,然后进行调用。 std::invoke( f, args... )
是类型 f(args...)
的轻微概括,它还处理一些其他情况。
可调用的内容包括函数指针或引用、成员函数指针、带有 operator()
的对象或指向成员数据的指针。
在成员情况下,第一个参数被解释为this
。然后将剩余的参数传递给 ()
(指针指向成员数据的情况除外),并展开 std::reference_wrapper
。
INVOKE 是 C++ 标准中的一个概念; C++17 简单地公开了一个直接执行它的 std::invoke
。我怀疑它被公开的部分原因是它在进行其他元编程时很有用,部分原因是每个标准库都已经在其中实现了 INVOKE 并且公开它基本上是免费的,部分原因是当它是一个具体的东西时它使谈论 INVOKE 变得更容易.
一个 Callable
对象,除了特定于 C++ 的细节之外,是 "something that can be called"。它不需要是一个函数:C++ 有许多可以调用的类型,并且每次在任何可能出现的地方(阅读:泛型代码)都遍历它们是有问题的并且过于重复。
这就是 std::invoke
的用途 - 它允许毫不费力地调用可以调用的通用对象(根据 C++17,它满足 Callable
概念)。
让我们考虑一个简单的例子:
void foo() { std::cout << "hello world\n"; };
template <bool b>
struct optionally_callable
{
std::enable_if_t<b> operator() () { std::cout << "hi again\n"; }
};
int main()
{
auto c = [] { std::cout << "hi from lambda\n" ;};
std::invoke(foo);
std::invoke(c);
auto o = optionally_callable<true>{};
//auto o2 = optionally_callable<false>{};
std::invoke(o);
}
o2
是不可调用的,也就是说,std::is_invocable<decltype(o2)>::value
是false
.
我刚刚阅读了有关 std::thread
和 std::bind
的文章,其中我遇到了 Callable
概念和 std::invoke
。
我在 cppreference 上看到了关于 std::invoke
的内容,但我不明白它说的是什么。这是我的问题:
std::invoke
、std::function
、std::bind
和Callable
是什么概念?他们之间是什么关系?
std::invoke
接受一些可调用的东西,以及调用它的参数,然后进行调用。 std::invoke( f, args... )
是类型 f(args...)
的轻微概括,它还处理一些其他情况。
可调用的内容包括函数指针或引用、成员函数指针、带有 operator()
的对象或指向成员数据的指针。
在成员情况下,第一个参数被解释为this
。然后将剩余的参数传递给 ()
(指针指向成员数据的情况除外),并展开 std::reference_wrapper
。
INVOKE 是 C++ 标准中的一个概念; C++17 简单地公开了一个直接执行它的 std::invoke
。我怀疑它被公开的部分原因是它在进行其他元编程时很有用,部分原因是每个标准库都已经在其中实现了 INVOKE 并且公开它基本上是免费的,部分原因是当它是一个具体的东西时它使谈论 INVOKE 变得更容易.
一个 Callable
对象,除了特定于 C++ 的细节之外,是 "something that can be called"。它不需要是一个函数:C++ 有许多可以调用的类型,并且每次在任何可能出现的地方(阅读:泛型代码)都遍历它们是有问题的并且过于重复。
这就是 std::invoke
的用途 - 它允许毫不费力地调用可以调用的通用对象(根据 C++17,它满足 Callable
概念)。
让我们考虑一个简单的例子:
void foo() { std::cout << "hello world\n"; };
template <bool b>
struct optionally_callable
{
std::enable_if_t<b> operator() () { std::cout << "hi again\n"; }
};
int main()
{
auto c = [] { std::cout << "hi from lambda\n" ;};
std::invoke(foo);
std::invoke(c);
auto o = optionally_callable<true>{};
//auto o2 = optionally_callable<false>{};
std::invoke(o);
}
o2
是不可调用的,也就是说,std::is_invocable<decltype(o2)>::value
是false
.