정적 함수가 아닌 클래스에서 함수를 가져 오는 피사체 옵저버 패턴을 확장하려고합니다. 나는 후안 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 클래스에 대해 함수 인터페이스에 추가하여이를 알리고 싶지 않습니다. 감사합니다
빙고를! 매력처럼 작동합니다. 내가 깨달은 한가지는 등록 개체에 대한 함수 구현이 템플릿 화되어 있기 때문에 hpp 파일에 있어야했습니다. 내가 cpp 파일에서 구현하려고 할 때 두통이 생기고 오류 메시지가 매우 혼란 스럽습니다. – jbholtz