使用 std::invoke 调用 std::function 对象的原因

问题描述 投票:0回答:1
#include <iostream>
#include <functional>
#include <string>
#include <utility>

class MyClass {
public:
    void printMessage(const std::string &message) const {
        std::cout << "Message: " << message << std::endl;
    }
};

int main() {
    // Create an instance of MyClass
    MyClass myObject;

    // Example using std::function and std::invoke
    std::function<void(const MyClass&, const std::string&)> func =
        &MyClass::printMessage;
    std::invoke(func, myObject, "Hello from std::invoke!");

    // Example using std::function and its operator()
    func(myObject, "Hello from operator() of std::function!");

    // Example without std::function (direct member function pointer)
    void (MyClass::*memberFuncPtr)(const std::string&) const = &MyClass::printMessage;
    (myObject.*memberFuncPtr)("Hello from manual member function pointer!");

    return 0;
}

我知道

std::invoke
是一个很好的包装器,特别是在成员函数指针的上下文中。

我的问题是:如果我使用

std::function
,是否有任何理由使用
std::invoke
(而不是
std::function::operator()
来调用
std::function
可调用?或者它是否会引入不必要的性能开销?

c++ function-pointers std-function std-invoke
1个回答
0
投票

没有

std::invoke
ing
std::function
的推理,您已经完成了定义
std::function
模板参数的手动工作。

当您不关心对象类型时,

std::invoke
很有用。

  MyClass myObject;
  MyClass* myObjectPtr = &myObject;

  // Example using std::function and std::invoke
  std::function<void(const MyClass&, const std::string&)> func1 = &MyClass::printMessage;
  std::function<void(const MyClass*, const std::string&)> func2 = &MyClass::printMessage;
  auto func3 = &MyClass::printMessage;

  func1(myObject, "Hello from operator() of std::function!");
  func2(myObjectPtr, "Hello from operator() of std::function!");
  // Error
  // func1(myObjectPtr, "Hello from operator() of std::function!");
  // func2(myObject, "Hello from operator() of std::function!");

  std::invoke(func3, myObject, "Hello from std::invoke!");
  std::invoke(func3, myObjectPtr, "Hello from std::invoke!");
© www.soinside.com 2019 - 2024. All rights reserved.