2013-02-23 2 views
2

어떻게 멤버 함수 포인터를 정적 함수로 변환합니까?포인터를 멤버 함수로 변환하여 정적 함수를 가리키는 포인터

class ClassA 
{ 
public: 
    int n; 
    void func(); 
}; 
void ClassA::func() 
{ 
    n = 89; 
} 

class ClassB 
{ 
public: 
    float f1; 
    float f2; 
    void func(float f); 
}; 
void ClassB::func(float f) 
{ 
    f1 += f; 
    f2 += f; 
} 


int main (int argc, char *argv[]) 
{ 
    ClassA* a = new ClassA; 
    ClassB* b = new ClassB; 

    //PROBLEM IS HERE 
    void (* pf_func1)(void*) = ClassA.func; 
    void (* pf_func2)(void*, float) = ClassB.func; 


    pf_func1(a); 
    pf_func2(b, 10); 
} 
+0

그 코드의 여러 실수가 있습니다 해결 ClassA :: func' 대신에'ClassA.func'을 사용합니다 ... 좋은 책이나 대학 과정에서 C++에 대해 배우는 것으로 시작하는 것이 좋습니다. –

답변

2

당신 수 std::bind이 해당 클래스의 인스턴스에 :

여기 내 코드는이 멤버 함수를 a-Class::func을 결합

auto func1 = std::bind(&ClassA::func, a); 
func1(); 

. 그리고 유사 : 두 경우 모두하지

auto func1 = std::mem_fn(&ClassA::func); 
func1(a); 
auto func2 = std::mem_fn(&ClassB::func); 
func2(b, 10.0f); 

것을 :

auto func2 = std::bind(&ClassB::func, b, std::placeholders::_1); 
func2(10.0f); 

또는, 당신은 당신이 요청 구문을 제공, 당신은 쉽게가에 호출되는 객체를 변경할 수 있도록 std::mem_fn을 사용할 수 있습니다 func1func2은 실제로는 함수 포인터가 아니지만 그것들처럼 동작합니다. std::bindstd::mem_fn에서 반환되는 유형은 구현에 따라 정의됩니다. 그러나 둘 다 std::function으로 변환 할 수 있습니다. `new`를 사용하는 대신에 단지 스택에 변수를 넣어,`클래스 선언 후,

+0

당신은 엄청나게 빠릅니다. 방금 타이핑을 시작했습니다. –

+3

주 :'std :: bind'는 C++ 11 기능입니다; 컴파일러가 너무 오래되어서'boost :: bind'를 대신 사용할 수 있습니다. –

+0

다른 해결책. plz. 이건 좋지 않아! : –

-1
void(ClassA::*pf1)() = &ClassA::func; 
void(ClassB::*pf2)(float) = &ClassB::func; 
void (__thiscall * pf_func1)(void*) = (void (__thiscall *)(void*)) ((void*&)pf1); 
void (__thiscall * pf_func2)(void*, float) = (void (__thiscall *)(void*, float)) ((void*&)pf2); 

은`누락

:

+0

이것이 작동하면 순수 운이 있습니다 –

+0

예, 작동합니다 : | –

+1

이것은 정의되지 않은 동작입니다. 예 : 복수 상속을 사용하는 경우 –

관련 문제