2012-06-28 7 views
7

estoy usando una biblioteca externa que tiene un método que acepta un void *Obtener void * puntero al contenido de cualquier impulso ::

Quiero que este void * para que apunte a un objeto contenido dentro de un impulso :: cualquier objeto.

¿Es posible obtener la dirección del contenido de un impulso :: cualquier objeto?

Estoy tratando de jugar con myAny.content pero no tuve suerte hasta ahora! Espero que alguna combinación de dynamic_cast o unsafe_any_cast me brinde lo que necesito.

Gracias!

Respuesta

3

Esto no es posible, lamentablemente; boost::any_cast rechazará el elenco si el tipo es distinto del tipo contenido.

Si usted está dispuesto a utilizar un truco interna no compatible, el current version of the header tiene una función indocumentado y sin apoyo boost::unsafe_any_cast que (como su propio nombre indica) no pasa por la verificación de tipos realizado por boost::any_cast:

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

La cabecera tiene esto para decir sobre 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

Esto debería ser parte de la interfaz documentada, por lo que 'boost :: any' podría usarse con código heredado que usa' void * '. Lo más triste de todo, 'std :: experimental :: any' no parece tener siquiera un' unsafe_any_cast'. – alfC

5

Puede usar boost::any_cast para obtener un puntero al tipo subyacente (siempre que lo sepa en tiempo de compilación).

boost::any any_i(5); 

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

void* vpi = pi; 
+0

¿Qué está haciendo realmente este código? Parece que está convirtiendo la dirección en una int. ¿Cómo es que eso funciona? – ftvs

+1

Eso es lo que 'boost :: any_cast' hace. Tiene una semántica similar a 'dynamic_cast'. En este caso, el lanzamiento a 'int *' tendrá éxito, porque el tipo subyacente almacenado es un int. Encajonar a otro tipo de puntero (digamos 'float *'), resultaría en un 'nullptr' que se devuelve. Lanzar a un tipo de referencia tendrá éxito o lanzará una excepción 'boost :: bad_any_cast'. 'boost :: any' funciona solo en coincidencias de tipo exacto, usa' typeid' para hacer coincidir si lo recuerdo correctamente. – Chad

Cuestiones relacionadas