我正在使用任何类型的值将一些类打包到 ptr_map 中。
class EventManager
{
ptr_map<string, any> mSomeMap;
public:
typedef signals2::signal<void (int someSignature)> KeyEvent;
EventManager()
{
mSomeMap["KeyPressed"] = new any(new KeyEvent());
}
};
现在我想从任何恢复我的信号对象。这是一个特殊的功能:
template<typename EventType>
EventType *get(const string &signalName)
{
try {
return any_cast<EventType*>(mSomeMap[signalName]);
} catch(bad_any_cast &e){}
}
你可能还记得,boost 的信号是不可复制的,所以我只能存储指针,我的函数也应该返回指针。
现在示例用法:
evManager.get<EventManager::KeyEvent>("KeyPressed");
在这里我得到段错误。我检查了get函数中每个对象的类型:
typeid(EventType).name()
→ N5boost8signals26signalIFvRN2sf5Event8KeyEventEENS0_19optional_last_valueIvEEiSt4lessIiENS_8functionIS6_EENSB_IFvRKNS0_10connectionES5_EEENS0_5mutexEEE
mSignalAssociation[signalName].type().name()
→ N10__cxxabiv119__pointer_type_infoE
有什么问题吗?与铸造一致的段错误。任何对象都应该包含插入类型吗?为什么它不想投射。