2013-02-23 172 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

存在這樣的代碼片段種種失誤,遺漏';'班後聲明,使用'new',而不是僅僅把變量在堆棧中,使用'ClassA.func'而不是'ClassA :: func' ...我建議你從一本好書或大學課程學習C++開始。 – 2013-02-23 14:13:46

回答

2

你可以std::bind它相關的類的實例:

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

此綁定成員函數Class::funca。而類似:

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

或者,你可以使用std::mem_fn,讓您可以輕鬆地改變物體,它被稱爲上,爲您提供您要求的語法:

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

這並不是說在這兩種情況下func1func2實際上並不是函數指針,但它們的行爲與它們相似。從std::bindstd::mem_fn返回的類型是實現定義的。但是,它們都可以轉換爲std::function

+0

你快得令人難以置信。我剛剛開始打字。 – 2013-02-23 12:47:49

+3

注意:'std :: bind'是C++ 11的一個特性;如果您的編譯器太舊,您可以使用boost :: bind代替。 – 2013-02-23 12:47:58

+0

另一種解決方案。 PLZ。不是很好 ! :( – 2013-02-23 12:57:19

-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

如果這樣做,那麼它是純粹的運氣。 – 2013-02-24 05:37:45

+0

是的,這是有效的。:| – 2013-02-24 05:57:46

+1

這是未定義的行爲。例如,如果使用多重繼承 – 2013-02-24 05:59:05