0

我正在使用任何类型的值将一些类打包到 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

有什么问题吗?与铸造一致的段错误。任何对象都应该包含插入类型吗?为什么它不想投射。

4

1 回答 1

3
ptr_map<string, any> mSomeMap;

...
    mSomeMap["KeyPressed"] = new any(new KeyEvent());

你知道这里发生了什么吗?首先,您动态创建一个 KeyEvent 对象,该对象会产生一个指针。然后这个指针被包装到一个任意对象中,该对象也是动态创建的,它还返回一个指针,然后再次通过赋值隐式包装在另一个任意对象中。

此外,要从任何对象中提取正确的值,您需要知道确切的类型。因此,例如,如果您将Derived-pointer 打包到 any 对象中,您将无法通过 an 访问它,any_cast<Base*>因为就用于跟踪类型的对象而言Base*Derived*它们是不同的类型。只是不知道如何将打包的指针转换为您的指针。std::type_infoboost::anyboost::anyDerivedBase

Is there a special reason why you wrap so many things in any-objects including pointers to any-objects? Wouldn't it make sense to use something like a ptr_map<KeyType,BaseType>? You know that if you pack a pointer into an any object that you still need to delete the pointees yourself, right? The any-object is not going to do this for you.

于 2010-06-19T14:55:32.667 回答