#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
可调用?或者它是否会引入不必要的性能开销?
没有
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!");