2015-04-14 20 views
-1

我想在Pascal中傳遞一個類函數作爲C函數 的一個參數。它是通過關鍵字(object的過程)來實現的,所以編譯器會處理'this'參數。 但在C++中看起來很複雜。如何在C++中使用(pascal:object的過程)

#include <stdio.h> 

typedef void (*func)(void); 

class Class{ 
public: 
    void sub(void) 
    { 
     printf("Foo"); 
    } 
}; 

void test(func f) 
{ 
    f(); 
} 

int main() 
{ 
Class c; 
test(c.sub); 
} 
+4

問題是,在C++中,非靜態成員函數有一個隱藏的第一個參數,它成爲成員函數內的'this'指針。這意味着指向成員函數的指針與*指向非成員函數的指針*不相同。如果你搜索一下,你應該已經找到了成千上萬的網頁來解釋這個問題,其中包括許多重複的問題。 –

+0

感謝Joachim,我已經做到了,但是我沒有找到像上面代碼那樣的簡單情況 – user3464620

+0

我的意思是,我只是在尋找一個簡單的解決方案,遠離模板和C++ 11 – user3464620

回答

3

你需要的功能,採取一個泛型函數類型,可以使其成爲一個模板:

template <typename F> 
void test(F f) { 
    f(); 
} 

或使用類型擦除:

#include <functional> 

void test(std::function<void()> f) { 
    f(); 
} 

然後使用std::bind或一個將成員函數綁定到對象的lambda:

test(std::bind(&Class::sub, &c)); 
test([&]{c.sub();}); 
相關問題