2012-09-25 58 views
0

我想實現觀察者模式的捕獲,我需要添加新的功能到每個觀察員稍後在項目中。Boost ::綁定對象佔位符

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)爲對象參數代碼上述塊的上下文正確,或者這是未定義的行爲?

關於綁定的boost文檔沒有指定僅爲函數參數的對象使用佔位符。

回答

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可以使用的東西(例如指針或引用)所忽略,它就會正確地調用該函數。

+0

我明白了,我並不真正瞭解boost :: mem_fn,所以我會讀它是如何工作的。謝謝。 – andre

+0

閱讀更多內容後,我明白了。謝謝。 – andre