C++ 从任何

C++ 从任何,c++,boost,casting,boost-any,C++,Boost,Casting,Boost Any,我正在用任何类型的值将一些类打包到ptr_映射中 class EventManager { ptr_map<string, any> mSomeMap; public: typedef signals2::signal<void (int someSignature)> KeyEvent; EventManager() { mSomeMap["KeyPressed"] = new any(new KeyEv

我正在用任何类型的值将一些类打包到ptr_映射中

class EventManager
{
   ptr_map<string, any> mSomeMap;
   public:
      typedef signals2::signal<void (int someSignature)> KeyEvent;
      EventManager()
      {
         mSomeMap["KeyPressed"] = new any(new KeyEvent());
      }
};
怎么了?这一缺陷与铸件一致任何对象是否应包含插入类型?为什么它不想投。

ptr\u-map-mSomeMap;
ptr_map<string, any> mSomeMap;

...
    mSomeMap["KeyPressed"] = new any(new KeyEvent());
... mSomeMap[“KeyPressed”]=newany(newkeyevent());
你知道这里发生了什么吗?首先,动态创建一个KeyEvent对象,该对象生成一个指针。然后,该指针被包装到一个也被动态创建的any对象中,该对象还返回一个指针,然后该指针又被赋值隐式包装到另一个any对象中

此外,要从任何对象中提取正确的值,您需要知道确切的类型。因此,例如,如果您将一个
派生的
-指针打包到一个any对象中,您将无法通过
any\u cast
访问它,因为
Base*
派生的*
std::type\u info
对象
boost::any
用于跟踪类型方面是不同的类型
boost::any
只是不知道如何将压缩的
派生的
-指针转换为您的
-指针

任何
-对象(包括指向
任何
-对象的指针)中包装这么多东西有什么特殊原因吗?使用类似于
ptr\u地图的东西是否有意义?您知道,如果您将指针打包到任何对象中,您仍然需要自己删除指针对象,对吗?任何对象都不会为您执行此操作。

ptr\u map mSomeMap;
...
mSomeMap[“KeyPressed”]=newany(newkeyevent());
你知道这里发生了什么吗?首先,动态创建一个KeyEvent对象,该对象生成一个指针。然后,该指针被包装到一个也被动态创建的any对象中,该对象还返回一个指针,然后该指针又被赋值隐式包装到另一个any对象中

此外,要从任何对象中提取正确的值,您需要知道确切的类型。因此,例如,如果您将一个
派生的
-指针打包到一个any对象中,您将无法通过
any\u cast
访问它,因为
Base*
派生的*
std::type\u info
对象
boost::any
用于跟踪类型方面是不同的类型
boost::any
只是不知道如何将压缩的
派生的
-指针转换为您的
-指针


任何
-对象(包括指向
任何
-对象的指针)中包装这么多东西有什么特殊原因吗?使用类似于
ptr\u地图的东西是否有意义?您知道,如果您将指针打包到任何对象中,您仍然需要自己删除指针对象,对吗?any对象不会为您这样做。

它可能不会导致您的问题,尽管它可能会掩盖问题,但捕获并忽略错误的强制转换,然后不返回值,这看起来是非常错误的。@stephen我刚刚删除了日志记录和其他内容的一部分。在这个主题中,这无关紧要。它可能不会导致您的问题,尽管它可能会掩盖问题,但捕获并忽略错误的转换,然后不返回值看起来是非常错误的。@stephen我只是删掉了日志记录和其他内容的一部分。这在这个主题中无关紧要。我必须在映射中存储不同的函数签名。升压信号是模板化的,不可复制。所以存储的唯一方法是指针和“any”,对吗?你得到第一段了吗?mSomeMap[“KeyPressed”]是boost::任何指定指针的类型的左值。因此,指向任意对象的指针被另一个任意对象包裹。你肯定不想这么做。正确的强制转换应该是这样的:any_cast(*any_cast(mSomeMap[“KeyPressed”])@sellibitze,您说的是“一个指针,然后通过赋值隐式地包装在另一个any对象中”。但是ptr_映射不是持有boost::any*,这不应该是一个简单的指针赋值吗?@Nikola:不是,ptr_映射提供了一个“混合”接口,其中操作符[]返回指针对象的左值,该值可能是默认构造的。要么我错了,要么OP需要更仔细地阅读boost::any和boost::ptr_映射的文档。我真的不明白为什么这里需要ptr_地图,一张普通的地图就足够了。@sellibitze:我刚刚意识到你在说什么。指针容器的全部作用是隐藏指针。我必须在映射中存储不同的函数签名。升压信号是模板化的,不可复制。所以存储的唯一方法是指针和“any”,对吗?你得到第一段了吗?mSomeMap[“KeyPressed”]是boost::任何指定指针的类型的左值。因此,指向任意对象的指针被另一个任意对象包裹。你肯定不想这么做。正确的强制转换应该是这样的:any_cast(*any_cast(mSomeMap[“KeyPressed”])@sellibitze,您说的是“一个指针,然后通过赋值隐式地包装在另一个any对象中”。但是ptr_映射不是持有boost::any*,这不应该是一个简单的指针赋值吗?@Nikola:不是,ptr_映射提供了一个“混合”接口,其中操作符[]返回指针对象的左值,该值可能是默认构造的。要么我错了,要么OP需要更仔细地阅读boost::any和boost::ptr_映射的文档。我真的不明白为什么这里需要ptr_地图,一张普通的地图就足够了。@sellibitze:我刚刚意识到你在说什么。指针容器的全部作用是隐藏指针。
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
ptr_map<string, any> mSomeMap;

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