我正在使用ptr_map存储不同类型的指针。
boost::ptr_map<string, any> someMap;
我存储了一些模板化的类对象:
someMap.insert("1", new SomeClass<int>());
someMap.insert("2", new SomeClass<float>());
现在我想从地图中获取值。以下是带参考的示例:
template<typename T>
T &get(const string &someKey)
{
try
{
return any_cast<EventType&>(mSignalAssociation.at(signalName));
} catch(bad_any_cast &e)
{
// Logging here
}
}
get< SomeClass<int> >("1"); // This works
但是我不喜欢引用,因为我不能返回,例如,如果转换是坏的或者对象不存在,则返回NULL。
如何从此地图中获取指针?
T *get(const string &someKey)
{
return any_cast<EventType*>(mSignalAssociation.at(signalName));
}
这是构建但是在转换时失败,为什么?
答案 0 :(得分:1)
怎么样:
T *get(const string &someKey)
{
return &any_cast<EventType&>(mSignalAssociation.at(signalName));
}
(只是一个猜测)
答案 1 :(得分:1)
功能any_cast
如果传递指针, 它返回一个类似的合格 指向值内容的指针if 成功,否则为null 回。如果T是ValueType,那么 返回持有值的副本, 否则,如果T是参考 (可能是const限定的)ValueType, 它返回对持有的引用 值。
你想要的是指针语义。同样停止使用ptr_map,这是评论中指出的浪费。
map<string, any> someMap;
someMap["1"] = SomeClass<int>();
someMap["2"] = SomeClass<float>();
// this will be a valid pointer because someMap["1"] stores
// an object of SomeClass<int>
SomeClass<int>* valid_ptr = any_cast<SomeClass<int> >(&someMap["1"]);
// this will be null pointer because someMap["2"] doesn't store
// an object of SomeClass<int>
SomeClass<int>* invalid_ptr = any_cast<SomeClass<int> >(&someMap["2"]);
如果由于某种原因需要将指针存储到这些SomeClass对象中,那么我认为您必须自己进行内存管理(手动释放存储在任何中的元素)并使用额外的间接级别来检测转换失败用空指针。如果你这样做,可能会更好地使用像boost :: shared_ptr这样的东西。
map<string, any> someMap;
someMap["1"] = new SomeClass<int>();
someMap["2"] = new SomeClass<float>();
// this will be a valid pointer because someMap["1"] stores
// an object of SomeClass<int>*
SomeClass<int>** valid_ptr = any_cast<SomeClass<int>*>(&someMap["1"]);
// this will be a null pointer because someMap["1"] does
// not store an object of SomeClass<int>*
SomeClass<int>** invalid_ptr = any_cast<SomeClass<int>*>(&someMap["2"]);
答案 2 :(得分:0)
但我不喜欢参考,因为我 如果不能返回,例如NULL 铸造是坏的或对象没有 存在
啊......所以这就是为什么你用指针,参考,铸造和内存管理容器来做这些体操的原因! :)
我指出previously;这会造成不必要的麻烦。 幸运的是,您的问题已经解决 - 只需查看Boost.Optional即可。