使用C ++類成員函數(shù)作為C回調(diào)函數(shù)我有一個C庫,需要注冊回調(diào)函數(shù)來定制一些處理?;卣{(diào)函數(shù)的類型是int a(int *, int *)。我正在編寫類似于以下內(nèi)容的C ++代碼,并嘗試將C ++類函數(shù)注冊為回調(diào)函數(shù):class A {
public:
A();
~A();
int e(int *k, int *j);};A::A(){
register_with_library(e)}intA::e(int *k, int *e){
return 0;}A::~A() {}編譯器拋出以下錯誤:In constructor 'A::A()',error:
argument of type ‘int (A::)(int*, int*)’ does not match ‘int (*)(int*, int*)’.我的問題:首先是可以注冊一個C ++類的memeber函數(shù),就像我想要做的那樣,如果是這樣的話怎么樣?(我在http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html上閱讀了32.8 。但在我看來它并沒有解決問題)是否有替代/更好的方法來解決這個問題?
3 回答

汪汪一只貓
TA貢獻1898條經(jīng)驗 獲得超8個贊
如果成員函數(shù)是靜態(tài)的,則可以這樣做。
類A的非靜態(tài)成員函數(shù)具有隱式的第一個類型參數(shù),class A*
該參數(shù)對應于該指針。這就是為什么如果回調(diào)的簽名也有第一個class A*
類型的參數(shù),你只能注冊它們。

縹緲止盈
TA貢獻2041條經(jīng)驗 獲得超4個贊
如果成員函數(shù)不是靜態(tài)的,你也可以這樣做,但它需要更多的工作(參見將C ++函數(shù)指針轉(zhuǎn)換為c函數(shù)指針):
#include <stdio.h>#include <functional>template <typename T>struct Callback;template <typename Ret, typename... Params>struct Callback<Ret(Params...)> { template <typename... Args> static Ret callback(Args... args) { func(args...); } static std::function<Ret(Params...)> func; };template <typename Ret, typename... Params>std::function<Ret(Params...)> Callback<Ret(Params...)>::func;void register_with_library(int (*func)(int *k, int *e)) { int x = 0, y = 1; int o = func(&x, &y); printf("Value: %i\n", o);}class A { public: A(); ~A(); int e(int *k, int *j);};typedef int (*callback_t)(int*,int*);A::A() { Callback<int(int*,int*)>::func = std::bind(&A::e, this, std::placeholders::_1, std::placeholders::_2); callback_t func = static_cast<callback_t>(Callback<int(int*,int*)>::callback); register_with_library(func); }int A::e(int *k, int *j) { return *k - *j;}A::~A() { }int main() { A a;}
這個例子在它編譯的意義上是完整的:
g++ test.cpp -std=c++11 -o test
你需要c++11
國旗。在您看到的代碼中,register_with_library(func)
調(diào)用func
了動態(tài)綁定到成員函數(shù)的靜態(tài)函數(shù)e
。
- 3 回答
- 0 關(guān)注
- 1532 瀏覽
添加回答
舉報
0/150
提交
取消