¿Qué ventajas inherentes ofrecen boost::any
y boost::any_cast
durante el uso de void*
y dynamic_cast
?¿Por qué `boost :: any` es mejor que` void * `?
Respuesta
La ventaja es que boost::any
es mucho más seguro que 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
En cuanto a su comentario, no se puede dynamic_cast
de un void*
. Puede dynamic_cast
sólo de punteros y referencias a los tipos de clases que tienen al menos una función virtual (tipos aka polimórficas)
Sí, pero eso es un elenco estático, no dinámico emitir.Tu comentario de que no puedes usar 'dynamic_cast' en' void * 'fue una mejor respuesta. ¿O fue su punto de que no hay nada que le impida usar 'static_cast' aunque no debería? :) –
@Paul: Agregué esa parte a mi respuesta –
Esto es lo que se referencia impulso dice:
Es compatible con la copia de cualquier tipo de valor y seguro comprobado extracción de que valor estrictamente contra su tipo.
Ninguno de estos se puede hacer con un void*
. No hay cheques para ti y tienes que saber a ti mismo a qué puedes recurrir.
No creo que dynamic_cast
entre en la imagen, ya que no tiene nada que ver con ninguno de los dos.
boost::any
llamadas destructores:
{
boost::any x = std::string("Hello, world");
x = std::wstring(L"Goodbye"); // string::~string called here
} // wstring::~wstring called here
alguna manera nadie mencionó que cualquier impulso :: <> actúa como un tipo de valor, donde como void * es un puntero. Eso significa que cualquier <> puede almacenar CUALQUIER objeto de CUALQUIER tamaño. Una vez almacenado, puede pasar la variable de cualquier <> escriba en cualquier lugar que desee; vive por sí mismo.
Por otro lado, void * tiene el tamaño del puntero, por lo que debe asegurarse de que sizeof (sus datos) < = sizeof (void *) o su vacío * sea solo un puntero a los datos reales almacenados en algún otro lugar. Pero en ese caso, es completamente diferente de cualquier <> porque ahora necesita preocuparse por eso "en otro lugar" y asegurarse de que siga siendo válido siempre que void * sea válido, lo que a veces podría convertirse en un desafío, especialmente en aplicaciones multiproceso .
Además de lo que otros han mencionado, <> es muy seguro, almacenará todo lo que desee, pero la única manera de recuperarlo es saber el tipo exacto o falla (lo que puede ser molesto cuando uno API le da unsigned int y su código quiere int se tratan como tipos diferentes). void * te permitirá hacer lo que quieras con él y si comienzas a leer o pavimentar sobre montón y/o memoria no inicializada, no te detendrá ni siquiera te hará saber que lo estás haciendo.
- 1. ¿Por qué Void es una estructura?
- 2. ¿Por qué ENUM es mejor que INT
- 3. Por qué ArrayDeque es mejor que LinkedList
- 4. Cómo imprimir boost :: any a una secuencia?
- 5. ¿Por qué sizeof (void) == 1?
- 6. ¿Por qué productIterator return type Iterator [Any]?
- 7. ¿Cómo inicializo boost :: any con una referencia a un objeto?
- 8. Qué método funciona mejor: .Any() vs .Count()> 0?
- 9. converting boost shared_ptr a void * y viceversa
- 10. ¿Por qué main() en java void?
- 11. ¿Qué significa "void * (*) (void *)" en C++?
- 12. ¿Por qué es más lento que contiene?
- 13. ¿Qué es double * (* p [3]) (void * (*)()); ¿media?
- 14. ¿El estándar C++ 11 proporciona algo así como boost :: any?
- 15. ¿Por qué NoSQL es mejor para "escalar" que RDBMS?
- 16. ¿Por qué el uso es mejor que el uso?
- 17. SVN? VSS? ¿Por qué es uno mejor que el otro?
- 18. ¿Qué caso es mejor?
- 19. ¿Por qué boost :: checked_delete "intencionalmente complejo"?
- 20. por qué boost :: call_traits <double> :: param_type es "const double &", mientras que no es "doble"
- 21. ¿Qué contrato (Diseño por contrato) es mejor?
- 22. ¿Por qué es mejor adjuntar un JPanel?
- 23. ¿Por qué es mejor usar filter_input()?
- 24. ¿Por qué el destructor de `boost :: multi_array_ref` no es virtual?
- 25. ¿Cuál es la diferencia entre void * y void **?
- 26. ¿Por qué boost no tiene un make_scoped()?
- 27. ¿Por qué start_routine para el retorno pthread_create void * y tomar void *
- 28. ¿Por qué javascript: void (0) se considera dañino?
- 29. ¿Qué es mejor y por qué? RaphaelJS o HTML5 Canvas?
- 30. por qué boost :: noncopyable require inheritance
No se puede 'dynamic_cast' from' void * ' –
@ArmenTsirunyan Siempre pensé que era posible hacerlo, aunque nunca lo intenté ...: | –
@PaulManta con respecto al comentario de Armen, usted puede echar un vistazo a esta pregunta http://stackoverflow.com/questions/6771998/dynamic-cast-of-void –