j'ai vu cet exemple sur un site Web, et les sites Internet mentionne: - « Une de ses utilisations (pointeurs vides) peut être de passer des paramètres génériques à une fonction »pointeurs vides 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 » t-il être plus simple d'écrire du code comme celui-ci?
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;
}
C'est moins de code, et c'est vraiment simple. Et dans le premier code, j'ai dû envoyer la taille du type de données ici, je ne le fais pas!
Mais maintenant vous avez deux fonctions au lieu d'une seule, ce qui signifie que vous ne pouvez pas (par exemple) enregistrer 'increase' en tant qu'auditeur d'événement dans un cadre. Vous avez raison de dire que l'exemple donné n'est pas un usage réaliste, et même dans un contexte plus approprié, il est inhabituel de passer un pointeur de données * et * une taille à un rappel. L'interface de 'pthread_create' est un exemple plus plausible, bien qu'en C++, vous préfériez utiliser une API C++-ish telle que Boost.Thread. –
Le premier est un idiome C commun que * certaines * personnes pensent est également approprié en C++. Ce n'est généralement pas le cas. Utilisez l'héritage, les modèles, etc., autant que possible pour préserver la sécurité du type. –
@larsman Je suis complètement d'accord. Cet exemple est seulement bon pour C. Pas pour C++. J'avais principalement utilisé '(void *)' lors de l'interfaçage avec le code C, comme un pointeur opaque. Et aussi avec MS COM en C++. AFAIR :: QueryInterface() utilise aussi un 'void * &' comme paramètre de sortie. –