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));
}

这构建但在铸造时失败,为什么?

4

3 回答 3

1

这个怎么样:

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

(只是猜测)

于 2010-06-28T12:46:32.413 回答
1

函数 any_cast

如果传递了一个指针,如果成功则返回一个类似限定的指向值内容的指针,否则返回 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 对象的指针,那么我认为您必须自己进行内存管理(手动释放存储在 any 中的元素)并使用额外的间接级别来检测带有 null 的强制转换失败指针。如果你这样做,可能更好地使用类似 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"]);
于 2010-06-28T13:38:56.253 回答
0

但我不喜欢引用,因为我不能返回,例如,如果转换错误或对象不存在,则返回 NULL

啊...这就是为什么您使用指针、引用、强制转换和内存管理容器来做这些体操的原因!:)

正如我之前指出的那样;这会造成不必要的麻烦。幸运的是,您的问题已经解决 - 只需查看Boost.Optional 即可

于 2010-06-28T23:38:59.020 回答