7

使用している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を使用して実行できますか?クラスメンバー関数をコールバックとして渡すにはどうすればよいですか?(3番目の答え)私は次のことを宣言できるようです(どこか、またはtypedefとして):

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

そして、A(ctor)のどこかでそのタイプのboost :: bindを呼び出し、それをCライブラリ呼び出しに渡します。

これは可能ですか、それとも私はオフベースですか?どうもありがとう。

4

3 に答える 3

5

いいえ。ファンクター型boost::functionは、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;
};
于 2010-01-04T19:56:42.760 に答える
1

マップを使用しないでください。実行時のオーバーヘッドが発生し、静的マップでコードが乱雑になります。

代わりに使用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.
    }
};
于 2011-02-04T11:50:39.140 に答える
0

メンバー関数の問題は、オブジェクト インスタンスへのポインターを最初のパラメーター ("this" ポインター) として自動的に受け取ることです。そのため、メンバー関数を C コールバック関数として使用することはできません。メンバー関数を使用するには、オブジェクトと関数ポインターを一緒にする必要があります。

于 2010-01-04T19:54:31.080 に答える