什么是c ++中的std :: invoke?

use*_*145 20 c++ c++17

我刚刚读过这篇文章std::thread,std::bind而且我已经面对这个Callable概念了std::invoke.

我读了std::invoke关于cppreference但是我不明白它说的是什么.这里是我的问题:
什么是std::invoke,std::function,std::bindCallable概念?他们之间的关系是什么?

Yak*_*ont 26

std::invoke需要一些可调用的东西,以及调用它的参数,并进行调用. std::invoke( f, args... )是一种轻微的打字概括f(args...),也可以处理一些其他情况.

可调用的东西包括函数指针或引用,成员函数指针,带有operator()a 的对象或指向成员数据的指针.

在成员案例中,第一个参数被解释为this.然后传递剩余的参数()(指向成员数据的情况除外).

INVOKE是C++标准中的一个概念; C++ 17简单地暴露了std::invoke直接使用它的东西.我怀疑它暴露的部分是因为它在进行其他元编程时很有用,部分原因是每个标准库都已经有一个INVOKE的实现并暴露它基本上是免费的,部分是因为它使得INVOKE的讨论变得更容易.

  • @VittorioRomeo 嗨,我来自未来。从 c++20 开始,`std::invoke` 是 `constexpr`。 (6认同)
  • 请注意,`std :: invoke`不是`constexpr`. (5认同)

edm*_*dmz 6

一个Callable对象,除了C++ -具体细节,"东西,可以被称为".它不一定是一个函数: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);

}
Run Code Online (Sandbox Code Playgroud)

o2不是可调用的,也就是说,std::is_invocable<decltype(o2)>::valuefalse.

  • 解释为什么这比编写`foo()`,`c()`和`o()`更好 (12认同)
  • @Baruch,https://youtu.be/zt7ThwVfap0?t=655 (4认同)