[英]Way to uniquely identify a pointer-to-member-function?
我正在嘗試為游戲引擎設置“類似協程”的系統,並且在尋找任何方法來唯一標識模板函數中指向成員函數的指針時遇到麻煩。
我希望能夠通過調用基類中指向成員函數指針的CoStart和CoStop方法來啟動和停止“行為”派生類中的協程。
CoStart( c_BlinkCycle );
CoStop( c_BlinkCycle );
協程方法具有標准簽名的地方,例如:
CoCommand MyBehavior::c_BlinkCycle( int step ) {
// ...
}
我可以在基類中使用模板來很好地處理這些問題:
template<typename T>
void CoStart( CoCommand (T::* coMethod)(int) ) {
// ...
}
但是,我希望能夠在首次使用協程時為Cooutine方法存儲一些元數據(在CoStart()中),並且不希望有任何獨特的方式來識別它們。 即:
if ( !metadataVector.contains( coMethod ) ) {
// ... set up metadata
}
如果我能以某種方式獲取地址,類型ID或名稱,或指向成員函數指針的任何唯一標識符,那么我將被設置。 但是有了模板,我似乎沒有任何可以將它們轉換為的共享指針類型,所以我有點不知所措。 (僅供參考,稍后我將使用boost :: function和boost :: bind,但看起來它們也不支持比較)。
您可以使用帶有某些成員的對象來存儲標識它們的唯一數據,而不是函數指針:
template <typename T>
class CycleMod {
public:
CycleMod(Meta data): meta(data) { }
CoCommand start(int){
};
CoCommand stop(int){
};
private:
MetaData meta;
};
您甚至可以使用類似的類包裝指針,而不使用成員函數。
好的,我想我會放棄嘗試固有地唯一標識c_BlinkCycle()類型的方法(除非有人知道使用C ++的技巧來做到這一點),而是讓它們在得到特定的特殊值時返回unueue ID值。步驟”參數:
CoCommand MyBehavior::c_BlinkCycle( int step ) {
if ( step == -1 ) {
return CoCommand_Identify(1);
}
// ... otherwise do the particular steps...
}
比我想要的多一些,但不是世界末日。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.