当前位置: 首页 > news >正文

【C++基础概念理解——std::invoke()函数基础知识】

std::invoke定义

std::invoke C++17 引入的一个标准库函数,用于通用地调用可调用对象(如函数指针、成员函数指针、函数对象、lambda 表达式等)。它提供了一种统一的方式来调用这些可调用对象,而不需要关心它们的具体类型。

功能

std::invoke 可以调用以下类型的可调用对象:

  1. 普通函数和函数指针:

    int func(int a) { return a; }
    std::invoke(func, 42); // 等价于 func(42)
    
  2. 成员函数指针:

    struct Foo {int member_func(int a) { return a; }
    };
    Foo foo;
    std::invoke(&Foo::member_func, foo, 42); // 等价于 foo.member_func(42)
    
  3. 成员变量指针:

    struct Foo {int member_var;
    };
    Foo foo{42};
    std::invoke(&Foo::member_var, foo); // 等价于 foo.member_var
    
  4. 函数对象和 lambda 表达式:

    auto lambda = [](int a) { return a; };
    std::invoke(lambda, 42); // 等价于 lambda(42)
    

示例

以下是一些使用 std::invoke 的示例:

#include <iostream>
#include <functional>int func(int a) {return a;
}struct Foo {int member_func(int a) {return a;}int member_var;
};int main() {// 调用普通函数std::cout << std::invoke(func, 42) << std::endl; // 输出 42// 调用成员函数Foo foo;std::cout << std::invoke(&Foo::member_func, foo, 42) << std::endl; // 输出 42// 访问成员变量foo.member_var = 42;std::cout << std::invoke(&Foo::member_var, foo) << std::endl; // 输出 42// 调用 lambda 表达式auto lambda = [](int a) { return a; };std::cout << std::invoke(lambda, 42) << std::endl; // 输出 42return 0;
}

总结

std::invoke 提供了一种统一的方式来调用各种类型的可调用对象,使得代码更加简洁和通用。

std::invoke(std::forward<F>(f), **this); 用于调用传入的 lambda 函数或其他可调用对象,并将当前对象的值作为参数传递给它。


http://www.mrgr.cn/news/25969.html

相关文章:

  • uts+uniapp踩坑记录(vue3项目
  • LEETCODE 每日一题 (单调栈 +滑动窗口模拟)
  • 什么是数字签名?
  • 【Python】从基础到进阶(七):深入理解Python中的异常处理与调试技巧
  • learn C++ NO.16——模板
  • 开放式耳机哪些品牌值得推荐?开放式耳机是什么意思?
  • P5043 [BJOI2015]树的同构(树哈希模版)
  • 【鸿蒙开发从0到1 day10】
  • 美创获评CNVD年度原创漏洞发现贡献单位!
  • springboot-创建连接池
  • 派遣函数 - 跟踪IRP的利器/RPTrace
  • 新书速览|JavaScript前端开发与实例教程(微课视频版)(第2版)
  • Kafka 实战演练:创建、配置与测试 Kafka全面教程
  • 最好用的 Redis 可视化工具,不愧是官方出品,功能确实强大(带私活源码)
  • element select + tree
  • 跨境电商,一人搞定?自从有了这个AI工具,赚遍全球市场
  • Linux云计算 |【第三阶段】PROJECT1-DAY2
  • “xi” 和 “dbscan” 在OPTICS聚类中是什么意思
  • 提升LLM能力表现的四种AI代理策略
  • JavaScript控制语句和函数的使用