2012-10-01 61 views
1

可能重複:
function pointer for a member function通過非靜態成員函數指針在C++

我不得不拿出一些東西像下面的C++。

我在下面的類中有一個成員函數。

class myClass { 
public: 
     void myFunc(); 

}; 

我有以下其中我應該打電話和傳回呼功能的另一庫,該庫對象

void AnotherFunction((void*)(pCallback)()) 
{ 
    // Here I will call back function 
} 

的myFunc的()我怎樣才能acheive上述功能?我知道類的靜態函數傳遞迴調,但在這裏我必須確保函數是線程安全的。如果不使用靜態,我如何才能達到這個要求?

+4

什麼實例的'myClass'你希望'pCallback'被叫做? –

+3

這已經成爲9999個問題的一個騙局。 – Puppy

+0

是的,基本上,你會希望它是一個成員函數指針(請參閱相關問題)並考慮上下文。 –

回答

4

目前,「最佳」解決方案是嘔吐異常。

void f(void(*fp)()) { fp(); } 
void mah_func() { 
    try { 
     throw; 
    } catch(my_class* m) { 
     m->func(); 
    } 
} 
int main() { 
    my_class m; 
    try { 
     throw &m; 
    } catch(my_class* p) { 
     f(mah_func); 
    } 
} 

這是一個噁心的濫用,但線程安全和最便攜。

+0

太棒了。誰說異常不可能有用? :-) –

+0

哈哈哈,男人,你讓我的一天:) – avakar

-1

在內部,成員函數總是將this指針設置爲「不可見」第一個參數,所以您的函數將具有void(myClass *)簽名。如果你能AnotherFunction的簽名更改爲void AnotherFunction(std::function<void()> callback)你可以做到以下幾點:

#include <functional> 
#include <iostream> 

void AnotherFunction(std::function<void()> callback) 
{ 
    callback(); 
} 

void fun() 
{ 
    std::cout << "fun()" << std::endl; 
} 

class Foo 
{ 
public: 
    Foo(int i) : i_(i) { } 

    static void gun() 
    { 
    std::cout << "Foo::gun()" << std::endl; 
    } 

    void hun() 
    { 
    std::cout << "Foo(" << i_ << ")::hun()" << std::endl; 
    } 

protected: 
private: 
    int i_; 
}; 

int main() 
{ 
    Foo foo(666); 
    AnotherFunction(fun); 
    AnotherFunction(Foo::gun); 
    AnotherFunction(std::bind(&Foo::hun, foo)); 
} 

它打印:

fun() 
Foo::gun() 
Foo(666)::hun() 
+0

說它是在另一個圖書館。這種暗示他不能。 – Puppy

+0

啊,你說得對。擺弄靜態成員絕對不是線程安全的,這使得你的解決方案成爲唯一的可能性。 – MadScientist

相關問題