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

问题描述 投票:0回答:3

我刚刚阅读了有关

std::thread
std::bind
的内容,我遇到了
Callable
概念和
std::invoke

我在

cppreference
上读到了关于 std::invoke 的内容,但我不明白它说什么。这是我的问题:
什么是
std::invoke
std::function
std::bind
Callable
概念?他们之间是什么关系?

c++ c++17
3个回答
59
投票

std::invoke
接受可调用的东西,以及调用它的参数,然后进行调用。
std::invoke( f, args... )
是对
f(args...)
的轻微概括,还可以处理一些其他情况。

可调用的东西包括函数指针或引用、成员函数指针、带有

operator()
的对象或指向成员数据的指针。

在成员情况下,第一个参数被解释为

this
。 然后剩余的参数被传递给
()
(除了指针到成员数据的情况),同时
std::reference_wrapper
展开。

INVOKE是C++标准中的一个概念; C++17 只是暴露了一个

std::invoke
来直接执行此操作。 我怀疑它被公开的部分原因是它在进行其他元编程时很有用,部分原因是每个标准库中都已经有 INVOKE 的实现并且公开它基本上是免费的,部分原因是当它是具体事物时,它使谈论 INVOKE 变得更容易.


17
投票
除了 C++ 特定的细节之外,

Callable
对象是“可以调用的东西”。它不一定是一个函数: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


0
投票

也许已经晚了,但这是

std::invoke

的另一种用法
    #include <iostream>
    #include <functional>

    class MyClass {
    public:
        void display(int number) {
            std::cout << "Number: " << number << std::endl;
        }
    };


    int main() {
        // Define a typedef for a pointer to a member function
        typedef void (MyClass::*FuncPtr)(int);
        // Use the typedef to declare a pointer to a member function
        FuncPtr fuc = &MyClass::display;
        // // Create an object of MyClass
        MyClass obj;
        // // Call the member function using the object and the pointer
        (obj.*fuc)(42); // samething using std::invoke
        std::invoke(fuc, obj, 67);
        return 0;
    }
© www.soinside.com 2019 - 2024. All rights reserved.