[英]Boost.Any get original type
我需要將any
變量轉換為原始類型。 我需要這樣做:
int i = 10;
any a(i);
int& i2 = any_cast<int &>(a);
但我希望類型存儲在any
變量中。 我寫這個:
int i = 10;
any a(i);
a::type_value& i2 = any_cast<a::type_value &>(a); // there is no actually type_value
我怎么能這樣做? 或者我如何從any
變量中提取原始類型? Boost.variant也很方便。
如果我不能這樣做,那么我還有另一個問題,C ++技術和庫可以存儲什么,並通過函數獲取類型來解決這個問題?
C ++是一種靜態類型語言。 boost::any
的類型是運行時值; 任何特定any
可以有任何類型。 這有點重要。
沒有any::type_value
,因為那必須是編譯時的值。 any
都是運行時構造。
考慮一下:
void TakeAnAny(boost::any a)
{
a::type_value& i2 = any_cast<a::type_value &>(a);
}
什么類型是any::type_value
? 幾乎任何類型的呼叫TakeAnAny
是合法的。 沒有any::type_value
可以減少的單一編譯時類型。 因此,編譯器無法確定類型。 由於C ++是靜態類型的,所以你就被軟管了。
任何一個的最終目的是類型擦除。 我有一些價值。 我想把它傳遞給其他一些功能。 此過程將通過幾個不同的通信層。 但我不一定希望所有這些不同的層確切地知道我正在使用的是什么類型。 我只需要自己和我想要的目的地來了解類型。 所以你把它粘在any
一個你很好。 其他人只看到any
,你們兩個都知道它包裝的內容。
此過程僅起作用,因為源和目標都知道值的實際類型。 如果您不知道類型,那么您不應該使用any
。 any
的目的是沒有函數坐在那里並將其轉換為一堆可能的類型(這就是boost::variant
的用途)。 目的是從函數的簽名中刪除類型。
這允許通用消息和信號之類的東西。 您在系統中注冊了一些事件處理程序。 您觸發一個以any
作為參數的事件。 觸發事件的人知道“ vec2
”事件總是以vec2
為參數。 所以每個“ vec2
”處理程序都將它轉換為vec2
。 “KeyPress”事件可能會傳遞一個int32_t
。 所以那些處理程序將它轉換為該類型。 等等。 每個人都知道它實際需要什么類型。
過去常常用void*
來完成。 問題是你有所有權問題( any
是一個值,而void*
是一個指針)。 此外, void*
是如此類型擦除,因此無法檢查您的演員是否正確。 any
只是一種類型和價值安全的void*
; 它可以防止你輸入錯誤的類型。
你真的不想要any
。 您的用例似乎也不需要variant
。 你似乎想要的是一個模板 。 這是一種不同的東西,它可以讓你做你真正想要的東西:擁有一個可以使用任何特定類型的功能,同時仍然能夠確切知道該類型是什么。
當然,模板有其自身的局限性。
您可以使用std::type_info
的映射到std::function<void(boost::any const&)>
對象來處理您知道並且想要處理的類型:您將在地圖中找到該條目使用a.type()
並調用相應的函數,該函數將知道如何處理參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.