boost::any
和boost::any_cast
報價優於void*
和dynamic_cast
?爲什麼boost :: any比void *更好?
回答
好處是,boost::any
比void*
更安全。
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_cast
從void*
。您可以dynamic_cast
只能從指針和引用其中至少有一個虛函數(又名多態類型)
是的,但這是一個靜態投射,而不是動態投。你對'void *'不能使用'dynamic_cast'的評論是一個更好的答案。或者你的觀點是,即使你不應該使用'static_cast',也沒有什麼能夠阻止你? :) – 2012-01-06 12:06:51
@Paul:將這一部分添加到我的答案 – 2012-01-06 12:09:25
這是類類型什麼升壓轉換器的參考說:
它支持任何類型的值複製和安全檢查提取 ,嚴格對其類型的價值。
這兩者都不能用void*
完成。有沒有檢查你,你必須知道自己可以投它。
我不認爲dynamic_cast
根本不會輸入圖片,因爲它與任何一個都沒有直接關係。
boost::any
呼叫析:
{
boost::any x = std::string("Hello, world");
x = std::wstring(L"Goodbye"); // string::~string called here
} // wstring::~wstring called here
某種程度上沒有人提到,升壓::任何<>充當值類型,其中爲void *是一個指針。這意味着任何大小的任何對象都可以存儲。一旦存儲,你可以在任何你想要的地方傳遞任何類型的變量;它靠自己生活。另一方面void *是指針大小的,所以你必須確保sizeof(你的數據)< = sizeof(void *)或者你的void *只是一個指向存儲的實際數據的指針別的地方。但在這種情況下,它與任何<>完全不同,因爲現在您需要擔心「其他地方」,並確保它只要void *有效就保持有效,這有時會成爲一個挑戰,特別是在多線程應用程序中。
如同其他人提到的那樣,任何<>都是非常安全的類型,它會存儲任何你想要的東西,但唯一的方法是找到它的確切類型或失敗(當一個API給你unsigned int和你的代碼想要int被視爲不同的類型)。 void *會讓你做任何你想做的事情,如果你開始閱讀或鋪墊堆棧和/或未初始化的內存,它不會阻止你甚至讓你知道你正在做這件事。
- 1. 爲什麼boost :: ptr_list使用底層void *?
- 2. 爲什麼std :: make_shared <>()比boost :: make_shared()有更好的性能?
- 3. 爲什麼使用str()比__str更好__()
- 4. 爲什麼使用比使用更好?
- 5. 爲什麼requestAnimationFrame比setInterval或setTimeout更好
- 6. 爲什麼mysql count(*)比count更好(id)
- 7. 爲什麼FileChannel比MemoryMappedBuffer表現更好?
- 8. 爲什麼str.format()比str()更好?
- 9. Excel VBA:爲什麼API比SendKeys更好?
- 10. 爲什麼ArrayDeque比LinkedList更好
- 11. 爲什麼poll()比select()更好?
- 12. 什麼比PHP Glob更好?
- 13. 什麼比邊框更好?
- 14. 什麼是void()的好用
- 15. 使用boost :: any是個好主意嗎?
- 16. 將'double *'轉換爲'boost :: any''
- 17. 爲什麼不使用boost ::可選作爲更好的scoped_ptr
- 18. cout map with boost :: any
- 19. 什麼是扁平捆綁,爲什麼Rollup比Webpack更好?
- 20. Boost IPC有什麼好處?
- 21. 爲什麼boost :: mutex比vs2013的std :: mutex更快?
- 22. boost :: container :: vector比std :: vector更快嗎?爲什麼?
- 23. 爲什麼不將Array.prototype.some命名爲.any?
- 24. void *(* void)(void *)代表什麼?
- 25. 什麼比Python中的Mechanize更好?
- 26. AS3:什麼是新/比AMFPHP更好
- 27. 什麼使得JIRA比Redmine更好
- 28. 有什麼比Django的flatpage更好嗎?
- 29. 還有什麼比%random更好嗎
- 30. 爲什麼數組被認爲比STL容器更好?
你不能''dynamic_cast'從void *' – 2012-01-06 12:01:59
@ArmenTsirunyan我總是認爲這是可能的,儘管我從來沒有嘗試過......:| – 2012-01-06 12:04:32
@PaulManta關於Armen的評論,你可以看看這個問題http://stackoverflow.com/questions/6771998/dynamic-cast-of-void – 2012-01-06 12:12:27