2012-06-28 14 views
7

używam zewnętrznej biblioteki, która ma metodę, która akceptuje void *Uzyskanie void * wskaźnik do zawartości boost :: dowolnym

Chcę tę pustkę * pkt do obiektu zawartego w boost :: dowolny obiekt.

Czy można uzyskać pod adresem zawartości boost :: dowolny obiekt?

Próbuję grać z myAny.content, ale bez powodzenia! Mam nadzieję, że niektóre kombinacje dynamic_cast lub unsafe_any_cast dadzą mi to, czego potrzebuję.

Dzięki!

Odpowiedz

3

To nie jest możliwe, niestety; boost::any_cast odmówi obsady, jeśli typ jest różny od zawartego typu.

Jeśli jesteś gotów użyć nieobsługiwany siekać wewnętrznej, current version of the header ma nieudokumentowane i nieobsługiwane funkcje boost::unsafe_any_cast który (jak sama nazwa wskazuje) omija sprawdzanie typu wykonywanej przez boost::any_cast:

boost::any any_value(value); 
void *content = boost::unsafe_any_cast<void *>(&any_value); 

nagłówek zawiera to powiedzieć o unsafe_any_cast:

// Note: The "unsafe" versions of any_cast are not part of the 
// public interface and may be removed at any time. They are 
// required where we know what type is stored in the any and can't 
// use typeid() comparison, e.g., when our types may travel across 
// different shared libraries. 
+0

Powinno to być częścią udokumentowanego interfejsu, więc 'boost :: any' może być używany ze starszym kodem, który używa' void * '. Najsmutniejszy ze wszystkich, 'std :: experimental :: any', nie wydaje się nawet mieć' unsafe_any_cast'. – alfC

5

Możesz użyć boost::any_cast, aby uzyskać wskaźnik do odpowiedniego typu (pod warunkiem, że znasz go podczas kompilacji).

boost::any any_i(5); 

int* pi = boost::any_cast<int>(&any_i); 
*pi = 6; 

void* vpi = pi; 
+0

Co ten kod faktycznie robi? Wygląda na to, że sam przesyła adres w int. Jak to działa? – ftvs

+1

To właśnie robi 'boost :: any_cast'. Ma podobną semantykę jak 'dynamic_cast'. W takim przypadku rzutowanie na 'int *' zakończy się pomyślnie, ponieważ przechowywany typ bazowy to int. Przechodzenie do innego typu wskaźnika (powiedzmy 'float *'), powodowałoby zwracanie 'nullptr'. Przesyłanie do typu referencyjnego albo się powiedzie, albo rzuci wyjątek 'boost :: bad_any_cast'. 'boost :: any' działa tylko na dokładnie dopasowanych typach, używa' typeid' do dopasowania, jeśli dobrze pamiętam. – Chad