2010-06-28 87 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