std::invoke 可统一调用各类可调用对象,如函数、成员函数、lambda 等。从 C++17 起支持,简化泛型编程中对不同调用语法的处理,适用于模板、绑定对象和引用包装,提升代码通用性与可读性。

在C++中,std::invoke 是一个非常灵活的工具,用于统一调用各种可调用对象,比如函数指针、成员函数指针、lambda表达式、函数对象等。它从 C++17 起被引入,极大地简化了泛型编程中的调用逻辑。
std::invoke 的基本用法
std::invoke 可以调用任意可调用对象,并自动处理参数传递。它的语法形式如下:
std::invoke(callable, args…);
其中 callable 是要调用的对象,args… 是传递给它的参数。
例如,调用普通函数:
立即学习“C++免费学习笔记(深入)”;
#include
#include iostream>
void say_hello() {
std::cout }
int main() {
std::invoke(say_hello); // 输出: Hello!
}
也可以调用带参数的函数:
int add(int a, int b) { return a + b; }
int result = std::invoke(add, 2, 3); // result = 5
调用成员函数
std::invoke 特别适合调用成员函数指针,无需繁琐的语法。你只需要传入成员函数指针和对象(或指针)即可。
struct Person {
void greet(const std::string& name) {
std::cout }
};
Person p;
std::invoke(&Person::greet, p, “Alice”); // 调用 p.greet(“Alice”)
即使使用对象指针,语法也一致:
Person* ptr = &p;
std::invoke(&Person::greet, ptr, “Bob”); // 正确调用
这避免了手动写 (*ptr).*func 或 ptr->*func 这类复杂语法。
在泛型编程中的优势
std::invoke 的真正价值体现在模板代码中。当你编写一个接受任意可调用对象的函数模板时,无法预知它是普通函数、lambda,还是成员函数指针。std::invoke 提供了一致的调用方式。
template
auto call_safely(Callable&& c, Args&&… args) {
return std::invoke(std::forward(c),
std::forward(args)…);
}
这个模板可以安全地调用:
普通函数lambda 表达式std::function 对象成员函数指针重载了 operator() 的类对象
比如:
auto lambda = [](int x) { return x * 2; };
int val1 = call_safely(lambda, 5); // 10
int val2 = call_safely(add, 3, 4); // 7
支持引用包装和绑定对象
std::invoke 还能正确处理 std::reference_wrapper 和绑定表达式(如 std::bind 的结果)。
include
int multi(int a, int b) { return a * b; }
auto bound = std::bind(multi, 2, std::placeholders::_1);
int result = std::invoke(bound, 7); // 相当于 multi(2, 7) = 14
即使 callable 是通过 std::ref 包装的,也能正常调用。
基本上就这些。std::invoke 让泛型调用变得更简单、更安全,是现代 C++ 中处理可调用对象的推荐方式。尤其在实现回调、事件系统或通用算法时,值得优先考虑。不复杂但容易忽略。
以上就是C++如何使用std::invoke_C++泛型调用与std::invoke使用的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1483486.html
微信扫一扫
支付宝扫一扫