2013-08-02 5 views
0

std :: function 개체를 사용하여 C 스타일의 함수 포인터를 피하려고했지만 상속하는 동안 멤버 함수를 호출하는 데 문제가 있습니다.std :: function parameter subclass

나는 표준 : 기능 수신하는 방법이 있습니다 지금

class A 
{ 
public: 
    void testCallbackA(); 

    // this is unrelated, but I need some features from the superclass 
    void goingToNeedThisWhenCallingTestCallbackA(int someParams); 
}; 

void method(std::function<void(A*)> callback); 

method(&A::testCallbackA); // this works fine 

좋은 모두,하지만 방법이있는 서브 클래스를 사용할 때 함수 포인터를 캐스팅해야합니다

class B : public A 
{ 
public: 
    void testCallbackB() { } 
}; 

method(&B::testCallbackB); // this fails 

std::function<void(A*)> call = &B::testCallbackB; // this fails 
std::function<void(B*)> call = &B::testCallbackB; // this works 

나는 메소드를 호출 할 수있게하려면 (& B : testCallbackB) 나는 함수 포인터를 해당 형식 정의하고 그것을 이런 식으로 캐스팅해야합니다

typedef void (A::*Callback)(); 

std::function<void(A*)> call = (Callback)&B::testCallbackB; // this works 

이 typedef를 피할 수 있습니까? 캐스트를 피할 수 있습니까? 나는 행운을 빌어 std :: bind를 조사해 보았다.

아이디어가 있으십니까? 그것은 나쁜 생각 때문에

답변

4

당신은

B b; 
method(std::bind(&B::testCallbackB, b)); 
+0

굉장! 조금 더 설명해 주시겠습니까? 더 많은 매개 변수를 사용하여이 작업을 수행 할 수 있지만 메서드 외부에서 설정하지 마십시오. –

5

이 변환 이 실패에 같은 std::bind을해야 할 수도 있습니다. std::function<void(A*)>은 가리키는 실제 오브젝트가 B인지 여부에 관계없이 과 함께A*과 함께 호출 할 수 있습니다. B이 아닌 A에서 B 멤버 함수를 호출 한 결과는 정의되지 않은 동작입니다.

+0

B의 메소드를 A로 호출하려고합니다. –

1

나는 당신의 문제를 이해한다면, 나는 당신이 A 급 가상에 testCallbackA를 만들기 위해 제안 및 방법을 호출 할 때 단순히 & :: testCallbackA를 사용합니다.

동적 메서드 디스패치은 실제 클래스 메서드를 호출 할 때주의를 기울여야하므로 유형 안전을 수동으로 피할 필요가 없습니다.

+0

클래스 A는 프레임 워크의 일부이므로 편집 할 수 없습니다. –

관련 문제