簡體   English   中英

類成員函數使用boost :: bind和boost :: function作為回調函數

[英]Class member function as callback using boost::bind and boost::function

我正在設置一個成員函數作為我正在使用的C庫的回調。 C庫設置如下的回調:

typedef int (*functionPointer_t)(myType1_t*, myType2_t*, myType3_t*);

setCallback(param1, param2, functionPointer, param4)

我想使用boost :: bind(如果可能的話)傳入函數指針。 我希望指向的函數是實例化類的成員,而不是靜態成員。 例如

Class A {
 public: 
  A();
 protected:
  int myCallback(myType1_t*, myType2_t*, myType3_t*); //aka functionPointer_t
}

可以使用boost :: bind和boost :: function來完成嗎? Per 如何將類成員函數作為回調傳遞? (第3個答案)似乎我可以聲明以下內容(某處或作為typedef):

boost::function<int (A*, myType1_t*, myType2_t*, myType3*> myCallbackFunction

然后在A(ctor)的某處調用boost :: bind在該類型上,並將其傳遞給C庫調用。

這可能嗎,還是我不在基地? 非常感謝。

不會。如boost::function這樣的Functor類型不會轉換為與C回調機制一起使用的函數指針。

但是,大多數C回調機制都有某種令牌機制,因此您的回調函數(它是靜態的)具有某種上下文信息。 您可以使用它來編寫一個包裝類,將這些標記映射到仿函數對象,並將執行傳遞到右側:

class CallbackManager {
public:
    typedef boost::function<int (type1*, type2*, type3*)> callback;

    static void setCallback(CallbackManager::callback cb)
    {
        void *token = ::setCallback(staticCallback);
        callbacks[token] = callback_I;
    }

    static void staticCallback(void* token, type1* a, type2* b, type3* c)
    { return mcallbacks[token](a, b, c); }

private:
    static std::map<void*, callback > callbacks;
};

不使用map,它會給運行時開銷帶來靜態映射並使代碼混亂。

請改用reinterpret_cast

例如

// clib.h
typedef void (*CALLBACK_FUNC)(int code,void *param);

void set_callback( CALLBACK_FUNC, void * param ); 

// a.h

class A {
public:
    A()
    {
        ::set_callback( &A::static_callback, this);
    }
private:
    static void static_callback(int code, void * param)
    { 
        A* self = reinterpret_cast<A*>(param);
        self->callback( code );
    }

    inline void callback( int code )
    {
        // write you code here.
    }
};

成員函數的問題在於它們自動接收指向對象實例的指針作為第一個參數 - “this”指針。 這就是為什么你不能使用成員函數C回調函數。 您必須將對象和函數指針放在一起才能使用成員函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM