You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ROS2教程中create_wall_timer使用std::bind作为回调的原因咨询

原因解释

  • 非静态成员函数的调用约束
    类的非静态成员函数调用时依赖对应的类实例,它本质上有一个隐式的this指针作为第一个入参,你提到的timer_callback的实际函数指针类型是void (MinimalPublisher::*)(),和create_wall_timer要求的无参可调用对象类型不匹配,无法直接传入。如果直接传入成员函数指针,定时器触发时也无法确定要绑定哪个类实例来执行回调,会直接报错。
  • std::bind的适配作用
    这里的std::bind(&MinimalPublisher::timer_callback, this)做了两件事:一是将当前类实例的this指针和成员函数timer_callback绑定,固定了成员函数调用需要的实例对象;二是把原来带隐式this参数的成员函数,适配成无参的可调用对象,完全匹配create_wall_timer的入参要求,定时器触发时就能直接在当前实例上执行回调逻辑。
  • 可选的替代写法
    除了std::bind,你也可以用C++ Lambda表达式实现相同的效果,写法如下:
    timer_ = this->create_wall_timer(
      500ms, [this](){ timer_callback(); }
    );
    
    本质上都是捕获当前实例的this指针,生成符合要求的无参回调对象。

内容的提问来源于stack exchange,提问作者Donglin Wang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 16:06:05