我正在尝试为游戏引擎设置一个“类似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,但看起来它们不允许进行比较)。
答案 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...
}
比我想要的更多样板,但不是世界末日。