2012-01-06 53 views
13

boost::anyboost::any_cast報價優於void*dynamic_cast爲什麼boost :: any比void *更好?

+9

你不能''dynamic_cast'從void *' – 2012-01-06 12:01:59

+0

@ArmenTsirunyan我總是認爲這是可能的,儘管我從來沒有嘗試過......:| – 2012-01-06 12:04:32

+1

@PaulManta關於Armen的評論,你可以看看這個問題http://stackoverflow.com/questions/6771998/dynamic-cast-of-void – 2012-01-06 12:12:27

回答

21

好處是,boost::anyvoid*更安全。

E.g.

int i = 5; 
void* p = &i; 
static_cast<double*>(p); //Compiler doesn't complain. Undefined Behavior. 
boost::any a; 
a = i; 
boost::any_cast<double>(a); //throws, which is good 

關於你的評論,你不能dynamic_castvoid*。您可以dynamic_cast只能從指針和引用其中至少有一個虛函數(又名多態類型)

+0

是的,但這是一個靜態投射,而不是動態投。你對'void *'不能使用'dynamic_cast'的評論是一個更好的答案。或者你的觀點是,即使你不應該使用'static_cast',也沒有什麼能夠阻止你? :) – 2012-01-06 12:06:51

+0

@Paul:將這一部分添加到我的答案 – 2012-01-06 12:09:25

5

這是類類型什麼升壓轉換器的參考說:

它支持任何類型的值複製和安全檢查提取 ,嚴格對其類型的價值。

這兩者都不能用void*完成。有沒有檢查你,你必須知道自己可以投它。

我不認爲dynamic_cast根本不會輸入圖片,因爲它與任何一個都沒有直接關係。

13

boost::any呼叫析:

{ 
    boost::any x = std::string("Hello, world"); 
    x = std::wstring(L"Goodbye"); // string::~string called here 
} // wstring::~wstring called here 
6

某種程度上沒有人提到,升壓::任何<>充當值類型,其中爲void *是一個指針。這意味着任何大小的任何對象都可以存儲。一旦存儲,你可以在任何你想要的地方傳遞任何類型的變量;它靠自己生活。另一方面void *是指針大小的,所以你必須確保sizeof(你的數據)< = sizeof(void *)或者你的void *只是一個指向存儲的實際數據的指針別的地方。但在這種情況下,它與任何<>完全不同,因爲現在您需要擔心「其他地方」,並確保它只要void *有效就保持有效,這有時會成爲一個挑戰,特別是在多線程應用程序中。

如同其他人提到的那樣,任何<>都是非常安全的類型,它會存儲任何你想要的東西,但唯一的方法是找到它的確切類型或失敗(當一個API給你unsigned int和你的代碼想要int被視爲不同的類型)。 void *會讓你做任何你想做的事情,如果你開始閱讀或鋪墊堆棧和/或未初始化的內存,它不會阻止你甚至讓你知道你正在做這件事。

相關問題