C++ invoke invoke是C++17标准引入的一个函数模板,用来调用可调用对象(Callable Object,如函数指针、函数对象、成员函数指针等)并返回结果。 invoke提供了统一的调用语法,无论可调用对象的类型是什么,都可以使用同一种方式进行调用。 详见:https://en./w/cpp/utility/functional/invoke 在C++17之前,调用不同类型的可调用对象需要使用不同的语法,比如直接调用函数、使用类对象的运算符重载操作符()来调用函数对象、使用成员函数指针来调用类成员函数等等。这些调用方式虽然能用,但是不够灵活,而invoke解决了这种不一致的问题。 invoke函数的实现原理是通过使用SFINAE(Substitution Failure Is Not An Error)技术来判断可调用对象的类型,并根据类型调用对应的调用方式。因此,无论可调用对象的类型是什么,都可以使用invoke函数来调用,而不需要使用不同的语法。 它的实现原理可以看https://en./w/cpp/utility/functional/invoke 下面是invoke的示例代码: #include <iostream> #include <functional>
void foo(int a, int b) { std::cout << 'a + b = ' << a + b << std::endl; }
class Bar { public: void operator()(int a, int b) { std::cout << 'a - b = ' << a - b << std::endl; } };
int main() { int a = 10, b = 5; std::invoke(foo, a, b); // 调用普通函数 Bar bar; std::invoke(bar, a, b); // 调用函数对象 std::invoke(&Bar::operator(), bar, a, b); // 调用成员函数 std::function<void(int, int)> f = foo; std::invoke(f, a, b); // 调用std::function对象 return 0; }
总结:std::invoke 提供了一种通用的函数调用语法,可以方便地调用各种可调用对象。 function与invoke的区别 std::function和std::invoke是两个不同的东西,功能也不同。std::function是一个函数对象的封装器,可以用来封装任意类型的可调用对象,比如函数指针、lambda表达式等,而 std::invoke 则是一个函数模板,用于在统一的接口下调用可调用对象。 比如,我们可以使用std::function来存储一个函数指针:
上述代码中,我们将函数指针
比如,可以使用 #include <functional> #include <iostream>
void foo(int a, int b) { std::cout << 'foo(' << a << ', ' << b << ')' << std::endl; }
class Bar { public: void bar(int a, int b) const { std::cout << 'Bar::bar(' << a << ', ' << b << ')' << std::endl; } };
int main() { std::invoke(foo, 1, 2);
Bar b; std::invoke(&Bar::bar, &b, 1, 2); }
上面代码,使用 总结, 来源:程序喵大人 |
|