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
相关产品推荐
相关产品推荐

