Я собираю некоторые классы в 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");
Здесь я получаю Segfault. Я проверил типы каждого объекта в получить функции:
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