gpt4 book ai didi

c++ - 从任何类型转换

转载 作者:行者123 更新时间:2023-11-28 01:11:11 25 4
gpt4 key购买 nike

我用任何类型的值将一些类打包到 ptr_map 中。

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

现在我想从 any 恢复我的信号对象。这是一个特殊的功能:

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

有什么问题吗?与类型转换一致的段错误。 任何对象是否应该包含插入类型?为什么它不想转换。

最佳答案

ptr_map<string, any> mSomeMap;

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

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

此外,为了从任何对象中提取正确的值,您需要知道确切的类型。因此,例如,如果您打包 Derived -指向任何对象的指针,您将无法通过 any_cast<Base*> 访问它因为Base*Derived*std::type_info 方面是不同的类型对象 boost::any用于跟踪类型。 boost::any只是不知道如何转换打包的 Derived -指向你的Base的指针-指针。

你在any里包这么多东西是不是有什么特别的原因? -对象包括指向any的指针-对象?使用类似 ptr_map<KeyType,BaseType> 的东西没有意义吗? ?你知道,如果你将一个指针打包到一个 any 对象中,你仍然需要自己删除指针,对吧? any-object 不会为你做这件事。

关于c++ - 从任何类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3075713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com