いくつかのクラスを任意の型の値で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){}
}
覚えていると思いますが、ブーストのシグナルはコピーできないので、ポインターのみを格納でき、関数もポインターを返す必要があります。
使用例:
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
何が問題なのですか?キャスティングに沿ったセグメンテーション違反。オブジェクトは挿入されたタイプで構成されている必要がありますか?キャストしたくない理由。