唯一标识指向成员函数的指针的方法?

时间:2012-12-14 23:31:11

标签: c++ function-pointers

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

我希望能够开始&通过在基类中调用指向成员函数的指针的CoStart和CoStop方法来停止“行为”派生类中的协程:

CoStart( c_BlinkCycle );
CoStop( c_BlinkCycle );

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

您可以使用具有某些成员的对象来存储标识它们的唯一数据,而不是函数指针:

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

您甚至可以使用类似的类包装指针,而不是使用成员函数。

答案 1 :(得分:0)

好吧,我想我会放弃尝试唯一地识别c_BlinkCycle()类型的方法(除非有人知道C ++技巧),而是当他们得到一个时,让他们返回一个unqiue ID值。某些特殊的“步骤”参数:

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

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

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