我有以下代码,其中我在ROS中挂接了回调函数以在// Do my stuff
中完成retSelf()
的事情:
template <typename T>
const typename T::ConstPtr retSelf(const typename T::ConstPtr self, size_t id)
{
// Do my stuff
return self;
}
template<typename CallbackType, typename ClassType>
void subscribe(void (ClassType::*cb)(typename CallbackType::ConstPtr const),
ClassType *thisPtr)
{
auto id = generateId(...);
auto selfP = &retSelf<CallbackType>;
auto returnSelf = boost::bind(selfP, _1, id);
auto callback = boost::bind(cb, thisPtr, returnSelf);
// Register callback
}
现在,此方法适用于以下呼叫:
void MyClass::MyCallback(sensor_msgs::Image::ConstPtr img){}
subscribe<sensor_msgs::Image>(&MyClass::MyCallback, this);
但是,在其他情况下,我想做这样的事情:
void MyClass::AnotherCallback(sensor_msgs::Image::ConstPtr img, int idx){}
subscribe<sensor_msgs::Image>(boost::bind(&MyClass::AnotherCallback, this, _1, 42));
也就是说,我还希望指定客户端软件知道但模板不知道的索引参数,最后我在AnotherCallback()
中设置了42
值,并在retSelf()
已执行。
请注意,我必须使用boost::bind
而不是标准库,因为ROS仅适用于第一种绑定。
答案 0 :(得分:1)
boost::bind
返回“未指定类型”功能对象,可以使用适当的模板参数将其隐式转换为boost::function
。
因此,根据您的情况,可以将boost::bind(&MyClass::AnotherCallback, this, _1, 42)
的返回值转换为boost::function<void(sensor_msgs::Image::ConstPtr)>
:
using callback_t = boost::function<void(sensor_msgs::Image::ConstPtr)>;
void subscribe(const callback_t &callback) {
// register callback
}
// ...
subscribe(boost::bind(&MyClass::AnotherCallback, this, _1, 42));