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

【C++】std::bind和std::placeholders

std::bind是C++11引入的函数适配器模板,用于创建新的可调用对象,其核心语法和功能如下

#include <functional>
auto new_callable = std::bind(callable, arg_list);
  • callable‌:可绑定对象(函数、成员函数、函数对象、lambda等)
  • arg_list‌:参数列表,支持混合固定值和占位符std::placeholders::_N

2. 参数绑定规则

  • 固定值绑定‌:直接传递值或对象,调用时无需再指定
    auto bound = std::bind(func, 10, 20);  // 绑定两个固定参数
    bound();  // 等价于 func(10, 20)
    

    占位符绑定‌:通过std::placeholders::_1_2等动态指定参数位置

    auto bound = std::bind(func, _1, _2);  // 调用时需传入两个参数
    bound(30, 40);  // 等价于 func(30, 40)
    

    3. 成员函数绑定

    需显式传递对象指针或引用,并指定占位符

    class MyClass {
    public:void method(int x) { /*...*/ }
    };
    MyClass obj;
    auto bound = std::bind(&MyClass::method, &obj, _1);  // 绑定对象和成员函数
    bound(42);  // 等价于 obj.method(42)
    

    4. 参数重排与适配

    通过占位符调整参数顺序

    void connect(string ip, int port);
    auto reversed = std::bind(connect, _2, _1);  // 参数顺序反转
    reversed(8080, "127.0.0.1");  // 等价于 connect("127.0.0.1", 8080)
    

    5. 引用参数绑定

    使用std::ref避免拷贝

    void update(int& val);
    int x = 0;
    auto bound = std::bind(update, std::ref(x));  // 绑定引用
    bound();  // x会被修改
    

    6. 返回值类型(可选)

    通过模板参数指定返回类型(需C++17起支持)

    auto bound = std::bind<int>(func, _1);  // 显式指定返回int类型
    

注意事项

  • 性能‌:相比直接调用或lambda有额外开销
  • 可读性‌:复杂绑定逻辑可能降低代码可读性,推荐优先使用lambda
  • 类型安全‌:需确保调用时参数匹配绑定签名
http://www.xdnf.cn/news/12952.html

相关文章:

  • c# 局部函数 定义、功能与示例
  • 「Java基本语法」变量的使用
  • redis--黑马点评--Redisson快速入门
  • 自动化过程中,如何定位一闪而过的toast?
  • 【11408学习记录】考研数学攻坚:行列式本质、性质与计算全突破
  • Xen Server服务器释放磁盘空间
  • 什么是CRM客户管理系统?怎样的企业需要用CRM客户管理系统?
  • SQL 注入:JDO与Hibernate
  • @Lazy原理与实战
  • 商品中心—1.B端建品和C端缓存的技术文档二
  • 【动态规划】B4336 [中山市赛 2023] 永别|普及+
  • 【阅读笔记】MemOS: 大语言模型内存增强生成操作系统
  • 总结___
  • CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx
  • python基础day06
  • 【大模型:知识库管理】--开源工具Ragflow构建知识库
  • 多核处理器系统中内存一致性问题举例
  • 记录一次opengl显示不出物体的错误原因
  • Vite中定义@软链接
  • 【笔记】AI Agent 项目 SUNA 部署 之 Docker 构建记录
  • 期货与期权市场基本原理是什么?
  • CSS设置元素的宽度根据其内容自动调整
  • 基于django+vue的健身房管理系统-vue
  • 等待组(waitgroup)
  • 【JVM】- 内存结构
  • 【python异步多线程】异步多线程爬虫代码示例
  • 电子电路中隔离的隔离技术​
  • 力扣-35.搜索插入位置
  • 数据挖掘是什么?数据挖掘技术有哪些?
  • 技术栈RabbitMq的介绍和使用