投射指针
问题描述:
我使用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));
}
这样构建但在铸造时失败,为什么?
答
功能any_cast
如果传递一个指针, 它返回一个同样合格 指针值的内容,如果 成功,否则返回空值为 。如果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"]);
答
但我并不喜欢引用,因为我 不能返回,例如,NULL,如果 铸造不良或对象不存在
啊...所以这就是为什么你要用指针,参考,铸造和内存管理容器来做这些体操练习的原因! :)
正如我指出previously;这会造成不必要的麻烦。 幸运的是,您的问题已得到解决 - 请查看Boost.Optional。
你为什么使用'ptr_map'? 'any'具有值语义,所以它可以存储在一个普通的'map'中。 – 2010-06-28 12:57:16
这正是我想到的。'ptr_map'存储一个指向其参数的指针,所以我们有一个指向小结构的指针,它本身就是指向真实对象的指针。谈论过早的悲观化。 – 2010-06-28 13:02:58