ROS 1 advertiseService接口中bool(T::*...)语法的作用是什么?
语法含义说明
你看到的bool(T::*srv_func)(MReq &, MRes &)是C++ 类非静态成员函数指针的标准声明语法,各部分的定义如下:
- 开头的
bool:对应回调函数的返回值类型 T::*:明确声明这是一个归属T类的指针,指向类的成员函数srv_func:该函数指针参数的变量名- 尾部的
(MReq &, MRes &):规定该成员函数必须接收两个引用类型的入参,依次是服务请求类MReq、服务响应类MRes
约束作用说明
这个语法确实是用来限制srv_func必须是T类的非静态成员函数:
- 不能传入普通全局函数、静态成员函数,这类函数不需要绑定类实例即可调用,对应的函数指针声明不需要加
T::*标识 - 因为非静态成员函数调用时依赖类实例的
this指针,所以这个API才需要同步传入obj参数作为回调绑定的类实例,实际触发回调时的调用逻辑等价于(obj->*srv_func)(请求对象, 响应对象)
ROS设计这个重载版本的advertiseService,就是为了支持开发者把服务回调逻辑封装在自定义类内部,避免全局函数污染命名空间,也方便回调函数访问类的内部状态。
内容的提问来源于stack exchange,提问作者wuxiekeji
相关产品推荐
相关产品推荐

