2014-12-03 6 views
1

C++에서 객체 지향 함수 포인터를 구현하려고합니다 (C#의 델리 게이트와 유사). std :: function 또는 Boost를 사용하여 C++에서 클래스 멤버 포인터를 구현하는 방법?

나는 마지막 클래스의 자리로 "MagicFunctionPainter"를 사용하는 예제 코드를 썼다 :

class A 
{ 
public: 
    MagicFunctionPointer p; 
    void fireEvent() 
    { 
     p(); 
    } 
}; 

class B 
{ 
public: 
    void init(A* a) 
    { 
     a->p = &onEvent; 
    } 
    void onEvent() 
    { 
     // in a real-world app, it'd modify class variables, call other functions, ... 
    } 
}; 

합니까 표준 : : 함수 또는 부스트 :: Signals2가를 지원합니까? 이 케이스를 지원하는 다른 라이브러리가 있습니까?

미리 감사드립니다.

+0

@sehe :

std::function<void(void)> // a function taking no arguments, returning nothing 

함께 B::init이 유형의 객체를 생성합니다 : 당신이 나를 의미하는 경우 : 이것은 내 유일한 StackOverflow 계정입니다. – user3684240

+0

좋아요 (보통 내가 그 사람에게 의견을 말하는 사람을 의미합니다). 괜찮아. 질문의 일치는 놀랍습니다. 이 코멘트를 곧 삭제할 것입니다. – sehe

답변

2

p의 유형과 같아야합니다

std::bind(&B::onEvent, this); 
+0

'a-> p = std :: bind (& B :: onEvent, this);를 시도했지만 컴파일되지 않습니다. 내 컴파일러 (g ++ 4.8.3)는 몇 가지 오류를 반환합니다. 첫째, 'function' 헤더에 함수를 반환하는 함수가 몇 번 있고 지정된 행에'operator = for operator = '가 없습니다. – user3684240

+0

@ user3684240 재현 할 수 없으며 실제적인 예를 보여줍니다 : http://ideone.com/yLCUtG 실수로 물건을 벗겨 내지 않았습니까? 'std :: function'의 시그니처를 클래스 멤버 함수 중 하나와 정확히 일치시키고 있습니까? – pmr

+0

이것은 내가 시도한 코드입니다 : http://ideone.com/tEcTXf – user3684240

0

당신은 바인딩해야합니다

boost::bind(&ClassX::member_function, boost::ref(instance))