3

我正在尝试为游戏引擎设置一个“类似协程”的系统,并且在寻找任何方法来唯一标识模板函数中指向成员函数的指针时遇到了麻烦。

我希望能够通过调用基类中的 CoStart 和 CoStop 方法来启动和停止“行为”派生类中的协程,这些方法采用指向成员函数的指针:

CoStart( c_BlinkCycle );
CoStop( c_BlinkCycle );

协程方法具有标准签名的地方,例如:

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

我可以在基类中使用模板来很好地处理这些:

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

但是,我希望能够在它们第一次使用时(在 CoStart() 中)为协程方法存储一些元数据,并且不知道有任何独特的方式来识别它们。IE:

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

如果我能以某种方式获得指向成员函数的地址、类型 ID、名称或任何类型的唯一标识符,我就会被设置。但是对于模板,我似乎没有任何可以将它们转换为的共享指针类型,所以我有点不知所措。(仅供参考,我稍后会使用 boost::function 和 boost::bind ,但看起来它们也不允许比较)。

4

2 回答 2

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 回答
0

好的,我想我将放弃尝试从本质上唯一地识别 c_BlinkCycle() 类型方法(除非有人知道 C++ 技巧),而是让它们在获得某个特殊时返回一个 unqiue ID 值“步骤”参数:

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

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

比我想要的多一点样板,但不是世界末日。

于 2012-12-15T00:15:02.450 回答