2015-06-29 81 views
0

我一直在使用boost一段時間,但我仍然是一個新手。 我想我應該是boost::any,因爲我不再需要使用模板來處理使用或返回的類型化對象。 但是我發現對我來說仍然不方便的是一種更平滑的功能或方法,如果有任何簡單的來回傳輸其held數據,肯定不會在以後使用cast_any提升庫和持有值

公約

(case 1) 
boost::any a="123456"; 
std::string s=boost::cast_any<std::string>(a); 
(case 2) 
boost:any a=123456; 
int i=boost::cast_any<int>a; 

定製boost_any:

(case 1) 
boost:any a="123456"; 
std::string s=a; 
(case 2) 
boost:any a=123456; 
int i=a; 

我喜歡這個功能,因爲我的調試程序時我找對象的準確held="123456"在這兩種情況下是相同的。 I think該lib的內部實現可能已經完成了(將其保存的內容轉換爲string)。 這個例子只顯示了POD類型,我想知道是否有人對這個定製做了什麼或者如何取得相同的結果,以消除cast_any

回答

0

Boost.Any是一個專門的工具,通常用於隱藏用戶提供的數據庫類型。這不是一個通用的「忘記類型,我有任何」系統。它不以那種方式工作,因爲最後你必須投射到特定類型。

將暗示any_cast隱藏在隱式轉換後面是一個壞主意,因爲如果存儲了錯誤的類型,它將拋出。在簡單的任務中完成這些工作將是很難找到的錯誤的重要來源。

無論如何,調試支持any是完全獨立於任何真實的代碼,並不會幫助你實現你想要的。如果您確實需要隱式轉換,則需要向any類添加模板轉換運算符。但我強烈建議不要這樣做,並且一般不要過度使用any。在大多數情況下,它實際上並沒有幫助,或其他解決方案是優越的。不要害怕模板。

0

boost::any以類型安全的C++實現。運行時效率和強打字是其設計背後的制約因素。儘管它提供了動態類型發現的機制,但它本身並不參與這種活動,也不願意在不同類型的值之間進行隱式轉換。

無論如何,還有其他any(例如Poco::DynamicAny)的實現延伸boost::any功能(隱式轉換爲目標類型時可能/安全和許多其他功能)。

關於此主題的一篇非常有趣的文章是DynamicAny (Overload Journal #86 - August 2008 - Aleksandar Fabijanic)