2010-06-28 85 views
0

我使用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

你为什么使用'ptr_map'? 'any'具有值语义,所以它可以存储在一个普通的'map'中。 – 2010-06-28 12:57:16

+0

这正是我想到的。'ptr_map'存储一个指向其参数的指针,所以我们有一个指向小结构的指针,它本身就是指向真实对象的指针。谈论过早的悲观化。 – 2010-06-28 13:02:58

回答

1

这个怎么样:

T *get(const string &someKey) 
{ 
    return &any_cast<EventType&>(mSignalAssociation.at(signalName)); 
} 

(只是猜测)

+0

这有效,但为什么? – Ockonal 2010-06-28 12:52:27

+0

以参考变量的地址(&运算符)为参考变量的参考地址提供对象的地址。 – shoosh 2010-06-28 15:21:43

1

功能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"]); 
0

但我并不喜欢引用,因为我 不能返回,例如,NULL,如果 铸造不良或对象不存在

啊...所以这就是为什么你要用指针,参考,铸造和内存管理容器来做这些体操练习的原因! :)

正如我指出previously;这会造成不必要的麻烦。 幸运的是,您的问题已得到解决 - 请查看Boost.Optional