ゲームエンジン用に「コルーチンのような」システムをセットアップしようとしていますが、テンプレート関数でメンバー関数へのポインターを一意に識別する方法を見つけるのに苦労しています。
メンバー関数へのポインターを取る基本クラスの 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を使用していますが、比較もできないようです)。