铸造指针

时间:2010-06-28 12:42:24

标签: c++ pointers boost reference boost-any

我正在使用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));
}

这是构建但是在转换时失败,为什么?

3 个答案:

答案 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即可。