开发者

Casting from any

开发者 https://www.devze.com 2023-01-03 20:40 出处:网络
I\'m packing some classes into ptr_map with any typed value. class EventManager { ptr_map<string, any> mSomeMap;

I'm packing some classes into ptr_map with any typed value.

class EventManager
{
   ptr_map<string, any> mSomeMap;
   public:
      typedef signals2::signal<void (int someSignature)> KeyEvent;
      EventManager()
      {
         mSomeMap["KeyPressed"] = new any(new KeyEvent());
      }
};

Now I want to restore my signal object from any. Here is开发者_如何学运维 a special function for this:

template<typename EventType>
EventType *get(const string &signalName)
{
    try {
        return any_cast<EventType*>(mSomeMap[signalName]);
    } catch(bad_any_cast &e){}
}

As you could remember, the boost's signals are noncopyable so I can store only pointers and my function should return pointers too.

Now sample usage:

evManager.get<EventManager::KeyEvent>("KeyPressed");

Here I get segfault. I checked the types of each objects in the get function:

typeid(EventType).name()
→ N5boost8signals26signalIFvRN2sf5Event8KeyEventEENS0_19optional_last_valueIvEEiSt4lessIiENS_8functionIS6_EENSB_IFvRKNS0_10connectionES5_EEENS0_5mutexEEE

mSignalAssociation[signalName].type().name()
→ N10__cxxabiv119__pointer_type_infoE

What's wrong is there? The segfault at line with casting. Any object should consist of inserted type or not? Why it doesn't want to cast.


ptr_map<string, any> mSomeMap;

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

Do you realize what happens here? First, you create a KeyEvent object dynamically which results in a pointer. Then this pointer is wrapped into an any-object which is also dynamically created which also returns a pointer which is then again wrapped in another any object implicitly by the assignment.

Also, for extracting the right value from an any object you need to know the exact type. So, for example, if you pack a Derived-pointer into an any object, you won't be able to access it via an any_cast<Base*> because Base* and Derived* are different types in terms of the std::type_info objects boost::any uses to keep track of types. boost::any just doesn't know how to convert the packed Derived-pointer to your Base-pointer.

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.

0

精彩评论

暂无评论...
验证码 换一张
取 消