0

私はBoostライブラリに非常に慣れていません。

glutDisplayFunc()などに渡されたコールバックを単一のクラスにバインドすることによって、グラフィカルプログラムのために何かを達成しようとしていました。

一定のグローバルクラスオブジェクトを持たずにこれを実現したかったのです。

コードで説明するには:

class CallbackHolder {
public:
    void dostuff(void) {
        // etc.
    }
};
void bind() {
    glutIdleFunc((new CallbackHolder())->dostuff);
}

これは、boost::bindとboost::functionを使用することで可能になることを私は知っています。

しかし、私が見た問題の1つは、boost::functionを通常の関数ポインターに戻すことでした。

これをどのように達成しますか?

4

1 に答える 1

0

からboost::function通常の関数ポインターに変換することはできません。また、メンバー関数ポインターから通常の関数ポインターに変換することもできません。ユーザーデータを提供できるコールバックを受け入れる関数の回避策があります。

残念ながら、過剰なインターフェースではユーザーデータを提供できません。これは、グローバル変数と正規関数を使用して、最も醜い解決策に固執していることを意味します。

class CallbackHolder {
  public:
    void dostuff(void) {
      // etc.
    }
};

CallbackHolder * g_callbackHolder = NULL;

void call_callback_holder(void) {
   if(g_callbackHolder) g_callbackHolder->dostuff();
}

void bind() {
   g_callbackHolder = new CallbackHolder();
   glutIdleFunc( &call_callback_holder );
}
于 2013-03-27T05:59:11.267 に答える