2014-09-18 2 views
0

정적 함수가 아닌 클래스에서 함수를 가져 오는 피사체 옵저버 패턴을 확장하려고합니다. 나는 후안 chopanza 우수 사례를 따라 갔다 Simple Observer Pattern c++11 지금은 간단한 함수가 아닌 등록 된 콜백으로 클래스 멤버 함수를 전달하고 싶습니다. 다음에 따라 내가 바인딩을 (& 클래스 :: 멤버 예)를 사용하여 클래스 멤버를 호출 할 수 있음을 깨달았다bind class function observer C++ 11

:에 첫 번째 매개 변수 이후

class A { 
public: 
    void A_Bar() { std::cout << "A" << m_nTest << "_bar()" << std::endl; } 
    void A_Foo(int n) { std::cout << "A" << m_nTest << "_Foo(" << n << ")" << std::endl; } 
    int m_nTest; 
}; 

int main(int argc, _TCHAR* argv[]) 
{ 
    A A1; A1.m_nTest = 1; 
    A A2; A2.m_nTest = 2; 
    Subject<EventType> s; 
    s.registerObserver(EventType::GREEN, bar); 
    s.registerObserver(EventType::GREEN, std::bind(&A::A_Bar, A2)); 
    s.registerObserver(EventType::GREEN, std::bind(&A::A_Bar, A1)); 
    s.notify(EventType::GREEN); 
} 

은에서 클래스가된다 라고 불린다.

  • 바()
  • A2_bar()
  • A1_bar()

을하지만 지금은도를 갖고 싶어 : 나는 내가 원하는 것을 정확하게 얻을 통지는 일부 정보를 관찰자 등급에 전달합니다.

template <typename Event> 
class Subject 
{... 
    void notify(const Event& event, int nParameter) const 
    { 
     for (const auto& obs : observers_.at(event)) obs(nParameter); 
    } 
private: 
    std::map<Event, std::vector<std::function<void(int)>>> observers_; 
}; 

을 그리고 지금 내 나는 등록하고 싶습니다 : 그래서 나는 다음에 코드를 수정 한

s.registerObserver(EventType::GREEN, std::bind(&A::A_Foo, A2)); 

사람이 내가 없거나 방법이 작업을 수행하는있는 무슨 날 수 있습니다. 필자는 Subject 클래스가 Observer 클래스에 대해 함수 인터페이스에 추가하여이를 알리고 싶지 않습니다. 감사합니다

답변

0

bind을 사용하는 코드는 원본 개체를 참조하려는 경우 & A2 및 & A2를 사용할 수 있기 때문에 문제가 될 수 있습니다. 내가 권하고 싶습니다있는

s.registerObserver(EventType::GREEN, std::bind(&A::A_Foo, &A2, std::placeholders::_1)); 

를 또는 람다를 사용합니다 : 귀하의 질문에 대답하기 위해, 당신은 사용할 수 있습니다

s.registerObserver(EventType::GREEN, [&](int i){ A2.A_Foo(i); }); 
+0

빙고를! 매력처럼 작동합니다. 내가 깨달은 한가지는 등록 개체에 대한 함수 구현이 템플릿 화되어 있기 때문에 hpp 파일에 있어야했습니다. 내가 cpp 파일에서 구현하려고 할 때 두통이 생기고 오류 메시지가 매우 혼란 스럽습니다. – jbholtz