代码之家  ›  专栏  ›  技术社区  ›  Ken Y-N

使用boost::bind result作为参数

  •  0
  • Ken Y-N  · 技术社区  · 5 年前

    我在回调函数中有以下的代码 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 值集和我的代码 返回() 执行。

    boost::bind 而不是标准库,因为ROS只适用于第一种绑定。

    0 回复  |  直到 5 年前
        1
  •  1
  •   Deedee Megadoodoo    5 年前

    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));