3

ゲームエンジン用に「コルーチンのような」システムをセットアップしようとしていますが、テンプレート関数でメンバー関数へのポインターを一意に識別する方法を見つけるのに苦労しています。

メンバー関数へのポインターを取る基本クラスの CoStart メソッドと CoStop メソッドを呼び出すことにより、「Behavior」派生クラスでコルーチンを開始および停止できるようにしたいと考えています。

CoStart( c_BlinkCycle );
CoStop( c_BlinkCycle );

コルーチン メソッドには標準のシグネチャがあります。たとえば、次のようになります。

CoCommand MyBehavior::c_BlinkCycle( int step ) {
    // ...
}

これらを適切に処理するために、基本クラスでテンプレートを使用できます。

template<typename T>
void CoStart( CoCommand (T::* coMethod)(int) ) {
    // ...
}

ただし、コルーチン メソッドを最初に使用するときに (CoStart() で) いくつかのメタデータを保存できるようにしたいと考えていますが、それらを特定する独自の方法についてはまったく知りません。すなわち:

if ( !metadataVector.contains( coMethod ) ) {
     // ... set up metadata
}

アドレス、型 ID、名前、またはメンバー関数へのポインターへの任意の種類の一意の識別子を何らかの方法で取得できれば、設定されます。しかし、テンプレートでは、それらをキャストできる共有ポインター型がないように見えるので、ちょっと途方に暮れています。(ちなみに、後でboost::functionとboost::bindを使用していますが、比較もできないようです)。

4

2 に答える 2

0

OK、c_BlinkCycle() タイプのメソッドを本質的に一意に識別しようとするのをあきらめて (誰かがそれを行うための C++ のトリックを知らない限り)、代わりに、特定の特別な "ステップ」パラメータ:

CoCommand MyBehavior::c_BlinkCycle( int step ) {
    if ( step == -1 ) {
        return CoCommand_Identify(1);
    }

    // ... otherwise do the particular steps...
}

私が望んでいたよりも少しボイラープレートですが、世界の終わりではありません.

于 2012-12-15T00:15:02.450 に答える
0

関数ポインターの代わりに、いくつかのメンバーを持つオブジェクトを使用して、それらを識別する一意のデータを格納できます。

template <typename T>
class CycleMod { 
   public:
      CycleMod(Meta data): meta(data) { }
      CoCommand start(int){
      };
      CoCommand stop(int){
      };        
   private:
      MetaData meta;
};

メンバー関数を持つ代わりに、同様のクラスでポインターをラップすることもできます。

于 2012-12-14T23:42:00.180 に答える