J'ai hérité d'une grosse application écrite à l'origine en C (mais en même temps beaucoup de C++ y ont été ajoutés). Pour des raisons historiques, l'application contient beaucoup de pointeurs de vide. Avant de commencer à étouffer, laissez-moi vous expliquer pourquoi cela a été fait.Comment se débarrasser de void-pointers
L'application contient de nombreuses structures de données différentes, mais elles sont stockées dans des conteneurs «génériques». De nos jours j'utiliserais des conteneurs STL basés sur des templates, ou je donnerais à toutes les structures de données une classe de base commune, de sorte que le conteneur puisse stocker des pointeurs vers la classe de base, mais dans les [vieux? transtyper le struct-pointer en un pointeur vide.
De plus, il y a beaucoup de code qui fonctionne sur ces vides points, et utilise des constructions C très étranges à imiter polymorphisme C.
Je retravaille maintenant l'application, et en essayant de se débarrasser de la void-pointeurs. L'ajout d'une classe de base commune à toutes les structures de données n'est pas si difficile (quelques jours de travail), mais le problème est que le code est plein de constructions comme indiqué ci-dessous.
Voici un exemple de la façon dont les données sont stockées:
void storeData (int datatype, void *data); // function prototype
...
Customer *myCustomer = ...;
storeData (TYPE_CUSTOMER, myCustomer);
Voici un exemple de la façon dont les données sont extraites de nouveau:
Customer *myCustomer = (Customer *) fetchData (TYPE_CUSTOMER, key);
Je veux vraiment remplacer tous les pointeurs de vides avec un peu de smart-pointeur (reference-counted), mais je ne trouve pas de truc pour automatiser (ou du moins) m'aider à me débarrasser de tous les lancements de et vers les pointeurs de void.
Des conseils sur la façon de trouver, de remplacer ou d'interagir de quelque manière que ce soit avec ces conversions?
Je crois vraiment qu'il n'y a pas de truc pour le faire automatiquement. L'un après l'autre ... – INS
Que font les fonctions de stockage et de récupération avec 'datatype'? Est-ce qu'ils font une copie aveugle de la structure ou simplement stocker ce pointeur vide? –
Le type de données est utilisé pour stocker toutes les données du même type de données et pour exécuter une logique «commune» sur les types de données. Comme dit, il émule le polymorphisme en C. simple – Patrick