首页 > 后端开发 > C++ > 正文

C++如何使用std::invoke_C++泛型调用与std::invoke使用

尼克
发布: 2025-11-11 20:45:09
原创
445人浏览过
std::invoke 可统一调用各类可调用对象,如函数、成员函数、lambda 等。从 C++17 起支持,简化泛型编程中对不同调用语法的处理,适用于模板、绑定对象和引用包装,提升代码通用性与可读性。

c++如何使用std::invoke_c++泛型调用与std::invoke使用

在C++中,std::invoke 是一个非常灵活的工具,用于统一调用各种可调用对象,比如函数指针、成员函数指针、lambda表达式、函数对象等。它从 C++17 起被引入,极大地简化了泛型编程中的调用逻辑。

std::invoke 的基本用法

std::invoke 可以调用任意可调用对象,并自动处理参数传递。它的语法形式如下:

std::invoke(callable, args...);

其中 callable 是要调用的对象,args... 是传递给它的参数。

例如,调用普通函数:

立即学习C++免费学习笔记(深入)”;

#include <functional>
#include <iostream>

void say_hello() {
    std::cout << "Hello!" << std::endl;
}

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 << "Hi, " << name << "!" << std::endl;
    }
};

Person p;
std::invoke(&Person::greet, p, "Alice"); // 调用 p.greet("Alice")

即使使用对象指针,语法也一致:

Person* ptr = &p;
std::invoke(&Person::greet, ptr, "Bob"); // 正确调用

这避免了手动写 (*ptr).*funcptr->*func 这类复杂语法。

AppMall应用商店
AppMall应用商店

AI应用商店,提供即时交付、按需付费的人工智能应用服务

AppMall应用商店 56
查看详情 AppMall应用商店

在泛型编程中的优势

std::invoke 的真正价值体现在模板代码中。当你编写一个接受任意可调用对象的函数模板时,无法预知它是普通函数、lambda,还是成员函数指针。std::invoke 提供了一致的调用方式。

template <typename Callable, typename... Args>
auto call_safely(Callable&& c, Args&&... args) {
    return std::invoke(std::forward<Callable>(c),
        std::forward<Args>(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 <functional>


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使用的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号