使用boost :: bind结果作为参数

时间:2019-02-25 07:49:05

标签: c++ c++11 templates boost

我有以下代码,其中我在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 :(得分: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));