어떤 유형의 값으로 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){}
}
는, 부스트의 신호가 그래서 포인터 만 저장하고 내 기능이 너무 포인터를 반환해야 noncopyable 있습니다 : 다음은이를위한 특별한 기능입니다.
이제 샘플 사용 :
evManager.get<EventManager::KeyEvent>("KeyPressed");
여기
내가 세그먼트 폴트를 얻을. 나는 얻을 함수에서 각 개체의 유형을 확인 : 잘못 무엇
typeid(EventType).name()
→ N5boost8signals26signalIFvRN2sf5Event8KeyEventEENS0_19optional_last_valueIvEEiSt4lessIiENS_8functionIS6_EENSB_IFvRKNS0_10connectionES5_EEENS0_5mutexEEE
mSignalAssociation[signalName].type().name()
→ N10__cxxabiv119__pointer_type_infoE
가? 주조와 일치하는 세그 폴트. 개체는 삽입 된 형식으로 구성되어야합니까? 왜 캐스팅하고 싶지 않은지.
가면을 사용하기는하지만 문제가되지 않을 수도 있지만 잘못된 캐스트를 포착하고 무시한 다음 값을 반환하지 않는 것은 매우 잘못된 것처럼 보입니다. – Stephen
@stephen 로깅과 다른 것들을 잘라 냈습니다. 이것은이 주제에서 중요하지 않습니다. – Ockonal