boost::any
ve boost::any_cast
ile ilgili içsel avantajlar, void*
ve dynamic_cast
kullanıyor?Neden "boost :: any" void * `den daha iyidir?
cevap
Avantajı, boost::any
, void*
'dan daha güvenlidir.
E.g. Yorumunuza gibi
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
, bir void*
gelen dynamic_cast
olamaz. Yalnızca en az bir sanal işlevini (aka polimorfik tipleri)
Evet, ama bu statik bir döküm, dinamik değil oyuncular.'Void *' üzerinde 'dynamic_cast' kullanamayacağınız yorumunuz daha iyi bir yanıt oldu. Ya da söylememelisiniz bile, 'static_cast' kullanarak sizi durduran hiçbir şey olmadı mı? :) –
@Paul: Cevabımın o kısmı eklendi –
budur sahip sınıf türlerine işaretçiler ve referanslarından dynamic_cast
Ne artırmak referans diyor edebilirsiniz:
Herhangi değer türü kopyalanmasını destekler ve güvenli kontrol türüne kesinlikle uygun olan çıkarımı.
Bunlardan hiçbiri void*
ile yapılabilir. Sizin için çek bulunmamaktadır ve kendinize neler yapabileceğinizi bilmek zorundasınız.
dynamic_cast
, bence doğrudan hiçbir şeyle alakası olmadığı için resme hiç girmiyor.
boost::any
aramalar yıkıcılar:
{
boost::any x = std::string("Hello, world");
x = std::wstring(L"Goodbye"); // string::~string called here
} // wstring::~wstring called here
nasılsa kimse o boost sözü :: herhangi <> olarak hükümsüz * Bir işaretçi olan bir değer türü, gibi davranır. Yani, <>, HERHANGİ bir boyutta HERHANGİ bir nesne saklayabilir. Bir kez saklandığında, istediğiniz herhangi bir <> türünün değişkenini iletebilirsiniz; kendi başına yaşıyor.
Diğer taraftan void * işaretçi boyutundadır, bu nedenle ya sizink (verileriniz) < = sizeof (void *) ya da void * öğesinin, saklanan gerçek verilere yalnızca bir işaretçi olduğundan emin olmalısınız. başka bir yer. Ama bu durumda, <> 'den tamamen farklıdır, çünkü şu anda "başka bir yerde" endişelenmeniz ve void *' in geçerli olduğu sürece, özellikle de çok iş parçacıklı uygulamalarda, bazen bir sorun haline gelebileceği sürece geçerli kalmasını sağlamanız gerekir. .
Artı Birbirlerinin de söylediğim gibi herhangi <> zaman bir tür can sıkıcı olabilen (o tam tipi bilmek istediğiniz her şeyi ama geri almak için tek yol olduğunu saklamak edeceğiz çok tip güvenli olup başarısız API size imzasız int verir ve kodunuz int istiyor farklı türler olarak kabul edilir). void * ile istediğiniz herhangi bir şeyi yapmanıza izin verir ve eğer okumaya veya yığın ve/veya başlatılmamış belleğe taşmaya başlarsanız, sizi durdurmayacaktır, hatta bunu yaptığınızı bile size bildirmeyecektir.
- 1. void * 'den struct'e aktarma
- 2. Neden Sass iyidir?
- 3. ziyaretçi forumu :: any
- 4. Builder kalıbı, Class nesnesindeki argümanlarla neden bir Oluşturucudan daha iyidir?
- 5. Boost :: any/std :: herhangi bir mağazada küçük nesneler var mı?
- 6. Neden Void bir yapıdır?
- 7. Daha iyi boost asio örnek
- 8. .Any()
- 9. Python 3, Python 2'den neden daha yavaş?
- 10. Neden 857 1000 ve 1001'den daha büyük? Javascript
- 11. C# neden örtülü void kullanıyor?
- 12. Neden productIterator türünü döndürür Iterator [Any]?
- 13. Üs 1'den daha düşük
- 14. "OrElse" den ne daha iyi kullanılır?
- 15. Neden DataFrame.loc [[1]] 1,800x df.ix [[1]] 'dan daha düşük ve df.loc [1]' den 3.500x daha yavaş?
- 16. boost shared_ptr öğesini void * 'e çevirme ve tersi
- 17. Java için Feed Okuyucu kitaplıkları hangisi daha iyidir?
- 18. Hangisi daha iyidir: tablo başına tek global dizi vs.
- 19. Dize enterpolasyonu ve string.format'tan hangisi performans açısından daha iyidir?
- 20. Hangi işletim sistemi geliştirme için daha iyidir: Debian veya Ubuntu?
- 21. PHP - require_once ('filename.php') veya require_once 'filename.php' kullanmak daha mı iyidir?
- 22. F # fonksiyonlarında parametrelerin tanımlanması, tupllerin kullanılması daha mı iyidir?
- 23. Postgresql db'yi optimize etmek için hangi yol daha iyidir?
- 24. Benzersiz kimlik değerlerini depolamak için neden bir UUID kullanmak daha iyidir?
- 25. Dağıtım dizisini Dağıtım-Sayma sıralama algoritmasında sağdan sola doğru işlemek neden daha iyidir?
- 26. boost :: edge segfault neden oluyor
- 27. Void System.Threading.Monitor.Enter ILMerge
- 28. Neden boost :: function std :: list dosyasında saklamıyorum?
- 29. ‘void (myClass :: *)() öğesini void (*)() dönüştürebilir()
- 30. boost :: tokenizer vs boost :: bölme
'' void * '' dynamic_cast' '' dır. –
@ArmenTsirunyan Bunu yapmanın mümkün olduğunu düşündüm, ama asla denemedim ...: | –
@PaulManta, Armen'in yorumuyla ilgili olarak, bu soruya bir göz atabilirsiniz: http://stackoverflow.com/questions/6771998/dynamic-cast-of-void –