我花了一段時間才弄清楚這一點,但boost::any
的語義很混亂。boost ::任何指針與值的混淆
對於值類型,您可以使用它像這樣:
int value = 100;
boost::any something;
something = value;
//...later...
int value = boost::any_cast<int>(&something);
此代碼是明確的,是有道理的,但商店value
內部的一個副本。這意味着我放置在boost::any
內的較大物體將被複制。當我修改boost::any
對象中包含的值(因爲它複製它而不會發生)時,我用其替換void*
的任何函數都會預期修改函數外部的值。
所以,如果我把球進去,事情就變得怪異:
我要提領返回值在這種情況下,因爲boost::any_cast
回報int**
!我也沒有檢查,但我認爲這可能會崩潰,如果something.empty() == true
。這根本不是直截了當的。
我不想將值存儲在我的boost::any
中,我希望它只能在指針上運行,並且在語義上接近void*
。指針指出,與一些類型安全混合在一起。基本上我想要的是boost::any_pointer
,或類似的東西。有沒有辦法阻止boost::any
接受除指針之外的任何內容?如果沒有,是否有替代boost::any
,可以給我我正在尋找的語義?
'boost :: any' is pretty e asy來創建,然後你可以改變你認爲合適的語義。 –
你的第一個片段不起作用,需要解引用(如snippet2)[Demo](http://coliru.stacked-crooked.com/a/df5bdb307f56b709) – Jarod42
你仍然可以將'boost :: any'包裝到類中只允許指針。 – Jarod42