0

C++からCAPIを呼び出したい。APIは関数ポインターを想定していますが、私にとっては、状態があるため、機能はC++関数オブジェクトに実装されています。

実際、必要な機能は2つの関数オブジェクトに分割されます。C apiは、各関数オブジェクトが返す2つのものを返すための2つのポインターパラメーターを持つ関数を想定しています。

グローバル関数を定義する以外に、Cの関数オブジェクトを使用する方法はありますか。たとえば、関数ポインターに再解釈できますか?

編集:

簡単にするために、コールバックの署名が無効であると想定してもかまいません(*f)(void*, int*, int*)

ああ、それはC++-03でなければなりません

4

1 に答える 1

3

ほとんどのAPIでは、voidポインターを介してある種のユーザー状態を渡すことができます。そこからオブジェクトへのポインタを渡すことができます。

struct my_obj
{
    void operator()(int*, int*) {}

    static void forwarder(void *state, int *x, int *y) { (*(my_obj*)state)(x, y); }
};

void install_fn(void (*)(void*,int*,int*), void *state);

my_obj obj;
install_fn(my_obj::forwarder, &obj);

状態を渡すことができないAPIの場合(GLUTは私が思いついた唯一のAPIの1つです)、(ポータブルな)運がありません。

于 2012-12-10T04:19:54.823 に答える