Использование результата boost :: bind в качестве параметра - PullRequest
0 голосов
/ 25 февраля 2019

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

1 Ответ

0 голосов
/ 01 марта 2019

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...