2012-09-25 4 views
0

나는 프로젝트에서 나중에 각 관찰자에게 새로운 기능을 추가해야하는 catch와 함께 관찰자 패턴을 구현하려고합니다.부스트 :: 개체 자리 표시 자와 바인딩

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

다음과 같이 코드가 통지 전화를 걸려면 다음과 같이 방법을 알려 내

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

이다.

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

지금 올바른 바인딩에 내 질문에 개체 매개 변수에 대한 자리 표시 자 (_1)을 사용하는 위의 코드 블록으로 컨텍스트를 제공하거나 정의되지 않은 동작은?

바인드에 대한 향상된 설명서에서는 함수 매개 변수에 대해서만 개체에 대해 자리 표시자를 사용하도록 지정하지 않았습니다.

답변

1

코드가 정확합니다.

Boost.Bind 문서는 코드

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

boost::mem_fn 포인터 멤버 함수를 호출 할 책임이

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

과 동일 함을 나타냅니다. 바인딩 된 객체가 포인터 또는 참조와 같이 boost::mem_fn에서 사용할 수있는 것으로 evaulated되면 해당 함수가 올바르게 호출됩니다.

+0

내가보기에 나는 boost :: mem_fn에 대해 잘 모른다. 그래서 나는 그것이 어떻게 작동하는지 읽을 것이다. 감사. – andre

+0

더 자세히 읽고 나면 이해합니다. 감사. – andre