vi este ejemplo en un sitio web, y los sitios web menciones: - "Uno de sus usos (punteros void) puede haber para pasar parámetros genéricos a una función"punteros void en C++
// increaser
#include <iostream>
using namespace std;
void increase (void* data, int psize)
{
if (psize == sizeof(char))
{ char* pchar; pchar=(char*)data; ++(*pchar); }
else if (psize == sizeof(int))
{ int* pint; pint=(int*)data; ++(*pint); }
}
int main()
{
char a = 'x';
int b = 1602;
increase (&a,sizeof(a));
increase (&b,sizeof(b));
cout << a << ", " << b << endl;
return 0;
}
wouldn' ¿Sería más fácil escribir código como el siguiente?
void increaseChar (char* charData)
{
++(*charData);
}
void increaseInt (int* intData)
{
++(*intData);
}
int main()
{
char a = 'x';
int b = 1602;
increaseChar (&a);
increaseInt (&b);
cout << a << ", " << b << endl;
string str;
cin >> str;
return 0;
}
Es menos código, y realmente sencillo. ¡Y en el primer código que tuve que enviar el tamaño del tipo de datos aquí no lo hago!
Pero ahora tiene dos funciones en lugar de solo una, lo que significa que no puede (por ejemplo) registrar 'increase' como un detector de eventos en algún marco. Tiene razón en que el ejemplo dado no es realista, e incluso en un contexto más apropiado, es inusual pasar un puntero de datos * y * un tamaño a una devolución de llamada. La interfaz para 'pthread_create' es un ejemplo más plausible, aunque en C++ es posible que prefiera utilizar una API más C++ - ish como Boost.Thread. –
La primera es una expresión en C común que * algunas * personas piensan que también es apropiada en C++. Por lo general, no lo es. Use herencia, plantillas, etc. siempre que sea posible para preservar la seguridad del tipo. –
@larsman Estoy completamente de acuerdo. Este ejemplo solo sirve para C. No para C++. Principalmente había usado '(void *)' cuando interactuaba con el código C, como un puntero opaco. Y también con MS COM en C++. AFAIR :: QueryInterface() también usa 'void * &' como parámetro de salida. –