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

c++ 类成员指针及其与`std::bind`交互使用的简单说明

c++ 类成员指针及其与`std::bind`交互使用的简单说明

      • **一、类成员指针**
        • **1. 指向成员变量的指针**
        • **2. 指向成员函数的指针**
      • **二、类成员指针与`std::bind`的交互**
        • **1. 绑定成员函数**
        • **2. 绑定成员变量**
        • **3. 绑定重载成员函数**
        • **4. 绑定智能指针管理的对象**
      • **三、注意事项**
      • **四、完整示例**
      • **五、总结**

关于C++类成员指针及其与std::bind交互使用的简单说明
***注:用到的时候查看,一般用不到,直接划走 ***


一、类成员指针

类成员指针分为两种:指向成员变量的指针指向成员函数的指针。它们需要通过类的实例来访问具体成员。

1. 指向成员变量的指针
class MyClass {
public:
    int value;
};

int MyClass::*ptr = &MyClass::value; // 定义成员变量指针

// 使用示例
MyClass obj;
obj.*ptr = 42; // 通过指针访问成员变量
2. 指向成员函数的指针
class MyClass {
public:
    void print() { std::cout << "Hello" << std::endl; }
};

void (MyClass::*funcPtr)() = &MyClass::print; // 定义成员函数指针

// 使用示例
MyClass obj;
(obj.*funcPtr)(); // 输出: Hello

二、类成员指针与std::bind的交互

std::bind可以将成员指针与对象实例绑定,生成一个可调用对象。以下是常见用法:

1. 绑定成员函数
#include <functional>
using namespace std::placeholders; // 用于占位符 _1, _2...

class MyClass {
public:
    void setValue(int v) { value = v; }
    int value;
};

MyClass obj;

// 绑定成员函数和对象实例
auto setter = std::bind(&MyClass::setValue, &obj, _1);
setter(42); // 等价于 obj.setValue(42)

// 绑定成员函数并延迟传递参数
auto delayedSetter = std::bind(&MyClass::setValue, &obj, 100);
delayedSetter(); // 等价于 obj.setValue(100)
2. 绑定成员变量
// 绑定成员变量
auto getValue = std::bind(&MyClass::value, &obj);
int val = getValue(); // 等价于 obj.value
3. 绑定重载成员函数

若成员函数有重载,需显式指定函数类型:

class MyClass {
public:
    void func(int) {}
    void func(double) {}
};

// 显式选择重载版本
auto boundFunc = std::bind(
    static_cast<void (MyClass::*)(int)>(&MyClass::func), 
    &obj, 
    _1
);
boundFunc(42); // 调用 func(int)
4. 绑定智能指针管理的对象
#include <memory>
auto objPtr = std::make_shared<MyClass>();
auto boundFunc = std::bind(&MyClass::print, objPtr);
boundFunc(); // 安全调用 objPtr->print()

三、注意事项

  1. 对象生命周期
    若绑定的是裸指针(&obj),需确保对象在调用时仍然有效。推荐使用shared_ptrstd::ref管理对象。

  2. 占位符的使用
    _1表示第一个参数,_2表示第二个参数,依此类推。例如:

    auto setter = std::bind(&MyClass::setValue, _1, _2);
    setter(&obj, 42); // 等价于 obj.setValue(42)
    
  3. 与Lambda的对比
    现代C++更推荐使用Lambda表达式,因其更简洁且类型安全:

    auto lambdaSetter = [&obj](int v) { obj.setValue(v); };
    lambdaSetter(42);
    

四、完整示例

#include <iostream>
#include <functional>
using namespace std::placeholders;

class Calculator {
public:
    int add(int a, int b) { return a + b; }
    int value = 0;
};

int main() {
    Calculator calc;

    // 绑定成员函数
    auto addFunc = std::bind(&Calculator::add, &calc, _1, _2);
    std::cout << addFunc(3, 4) << std::endl; // 输出: 7

    // 绑定成员变量
    auto getValue = std::bind(&Calculator::value, &calc);
    std::cout << getValue() << std::endl; // 输出: 0

    // 绑定智能指针对象
    auto calcPtr = std::make_shared<Calculator>();
    auto smartAdd = std::bind(&Calculator::add, calcPtr, _1, _2);
    std::cout << smartAdd(5, 6) << std::endl; // 输出: 11

    return 0;
}

五、总结

  • 类成员指针允许通过指针间接访问类的成员,需结合对象实例使用。
  • std::bind 可以将成员指针与对象绑定,生成灵活的可调用对象。
  • 推荐优先使用Lambda表达式,但在需要兼容旧代码或特定场景下,std::bind仍是一个强大的工具。

相关文章:

  • 使用 Docker 部署 BaGet 并推送 NuGet 包
  • 前端小食堂 | Day10 - 前端路由の时空裂隙
  • Java是值传递还是引用传递
  • 特征选择之特征重要性排序(基于树模型)
  • 如何用Kimi生成PPT?秒出PPT更高效!
  • 学习threejs,Animation、Core、CustomBlendingEquation、Renderer常量汇总
  • Java 依赖冲突终极解法:Maven 依赖树分析与强制版本锁定
  • 最左侧冗余覆盖子串
  • 【接口封装】——18、添加目录项列表响应
  • AMD(xilinx) FPGA书籍推荐
  • RabittMQ保证消息不丢失的几种手段
  • Spring Boot 项目中慢SQL优化方案
  • 基于微信小程序的超市购物系统+论文源码调试讲解
  • 【文心索引】搜索引擎测试报告
  • 【计算机网络】计算机网络的性能指标——时延、时延带宽积、往返时延、信道利用率
  • Trae IDE新建C#工程
  • 双目立体视觉(6.1)测距
  • 2025年科技趋势深度解析:从“人工智能+”到量子跃迁的技术革命
  • 练习题:72
  • 时序数据库 TDengine 化工新签约:存储降本一半,查询提速十倍
  • 局域网内做网站/杭州10大软件开发公司
  • 建设展示型网站公司哪家好/友情链接交换条件
  • 做网站第三方/深圳市seo上词多少钱
  • wordpress加漂浮广告/百度关键词自然排名优化公司
  • 别人盗用我的网站备案号怎么办/广州网络seo公司
  • 网站广告案例/会计培训机构排名