У меня есть следующий код, в котором я перехватываю функции обратного вызова в 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 работает только с первым типом привязки.