Boost :: bind与对象占位符

时间:2012-09-25 20:59:01

标签: c++ boost boost-bind

我正在尝试使用catch来实现观察者模式,我需要在项目中稍后向每个观察者添加新功能。

class Obsevers {
public:
    virtual ~Obsevers() {}
};

class TestObserver : public Obsevers {
public:
    void print1(int i) {
        std::cout << i << std::endl;
    }
};

class TestObserver2 : public Obsevers {
public:
    void print2(int i, char c) {
        std::cout << i << " , " << c << std::endl;
    }
    //possible new functions here later
};

我的通知方法如下:

template<typename Type, typename Notify>
void NotifyObserver(Notify notify) {
    typedef std::list<Obsevers*>::iterator iter;
    iter it = m_observers.begin();
    iter end = m_observers.end();
    for(; it != end; ++it) {
        Type * o = dynamic_cast<Type*>(*it);
        if(o == NULL) continue;
        notify(o);
    }
}

拨打电话通知代码如下。

NotifyObserver<TestObserver2>(boost::bind(&TestObserver2::print2, _1, 32, 'b'));

现在给出上面代码块的上下文,我的问题是在绑定中使用占位符(_1)来表示对象参数是正确的还是这个未定义的行为?

bind上的boost文档没有指定仅为函数参数使用占位符。

1 个答案:

答案 0 :(得分:1)

您的代码是正确的。

Boost.Bind文档表明您的代码

boost::bind(&TestObserver2::print2, _1, 32, 'b')

相同

boost::bind<void>(boost::mem_fn(&TestObserver2::print2), _1, 32, 'b')

其中boost::mem_fn负责调用指向成员函数的指针。只要绑定对象使用boost::mem_fn可以使用的东西(例如指针或引用)进行评估,它就会正确调用该函数。