2012-01-06 17 views
13

boost::any ve boost::any_cast ile ilgili içsel avantajlar, void* ve dynamic_cast kullanıyor?Neden "boost :: any" void * `den daha iyidir?

+9

'' void * '' dynamic_cast' '' dır. –

+0

@ArmenTsirunyan Bunu yapmanın mümkün olduğunu düşündüm, ama asla denemedim ...: | –

+1

@PaulManta, Armen'in yorumuyla ilgili olarak, bu soruya bir göz atabilirsiniz: http://stackoverflow.com/questions/6771998/dynamic-cast-of-void –

cevap

21

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)

+0

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ı? :) –

+0

@Paul: Cevabımın o kısmı eklendi –

5

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.

13

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 
6

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.

İlgili konular