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

C++ 什么是c+中的std::invoke+;?,c++,c++17,C++,C++17,我刚刚读了关于std::thread和std::bind的书,我遇到了Callable概念和std::invoke 我在上读到了关于std::invoke,但我不明白上面说的是什么。这是我的问题: 什么是std::invoke,std::function,std::bind和可调用的概念?它们之间的关系是什么?std::invoke接受一些可调用的东西,并使用参数调用它,然后执行调用std::invoke(f,args…是对键入f(args…的一种轻微概括,它还处理一些其他情况 可调用的对象包括

我刚刚读了关于
std::thread
std::bind
的书,我遇到了
Callable
概念和
std::invoke

我在上读到了关于
std::invoke
,但我不明白上面说的是什么。这是我的问题:

什么是
std::invoke
std::function
std::bind
可调用的概念?它们之间的关系是什么?

std::invoke
接受一些可调用的东西,并使用参数调用它,然后执行调用
std::invoke(f,args…
是对键入
f(args…
的一种轻微概括,它还处理一些其他情况

可调用的对象包括函数指针或引用、成员函数指针、带有
运算符()的对象或指向成员数据的指针

在成员情况下,第一个参数被解释为
this
。然后剩余的参数通过
std::reference_wrapper
s展开传递给
()
(指向成员数据的指针除外)


调用是C++标准中的一个概念;C++17简单地公开了一个直接执行该操作的
std::invoke
。我怀疑它被公开部分是因为它在做其他元编程时很有用,部分是因为每个标准库中都已经有了调用的实现,公开它基本上是免费的,部分是因为它使得在调用是一个具体的东西时谈论调用更容易。

a
可调用的
对象是,除了C++特定的细节之外,“可以调用的东西”。它不需要是一个函数:C++有许多类型可以调用,并且每次出现时(读:泛型代码)都是有问题的,而且重复性太强。 这就是
std::invoke
的用途-它允许轻松调用可以调用的通用对象(根据C++17,它满足
可调用的
概念)

让我们考虑一个简单的例子:

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);

}

void foo(){std::cout Note
std::invoke
是C++17,而不是C++11。请再次阅读主题参考,包括示例。这里的答案不太可能比已经提供的文档和示例更好。请查看CppCon 2015@mvrma上的这篇演讲,这是一篇很棒的演讲。我投票将这个问题作为非主题来结束,因为它是C只要阅读OP链接的文档就可以很容易地回答这个问题。注意,
std::invoke
不是
constexpr
@Yakk谢谢。我想我把invoke概念和
std::invoke
混淆了。如果我理解正确,invoke概念在
std::bind
std::thread
中使用。对吗?@user3397145我仍然不明白为什么在所有的大写字母中,这都是C++文档中没有其他东西的。@代码VistoRoMeOO,我来自未来。<代码>:/>代码>是代码> CONTXPROP</CUT>作为C++的20.改进点是什么?解释为什么写得更好,然后写代码> FoE()(<代码)> <代码>()(<代码> >和<代码>()(<代码)>巴鲁克,