LocalStone
Messages postés514Date d'inscriptionmercredi 19 mars 2003StatutMembreDernière intervention 1 mars 2009
-
9 janv. 2007 à 00:11
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 2010
-
10 janv. 2007 à 12:44
Salut,
Alors voilà ... Je me posais la question suivante : existe-t-il un moyen en C de gérer la généricité de manière transparente ? Je m'explique ...
En C#, lorsque l'on veut utiliser, par exemple, une pile, il suffit de faire Stack p = new Stack<Type>(); (en gros). On utilise les templates, quoi ...
Imaginons maintenant qu'en C, on veuille coder une structure qui simule une pile, le tout à l'ancienne, à l'aide de typedef et tout ça. Pour simuler la généricité, il suffit d'utiliser le pointeur void*. Ainsi, on aura par exemple une fonction pop qui aura le prototypage suivant : void Stack_push(Stack pile, void* element). De même, on aura : void* Stack_pop(Stack pile).
Le problème, c'est qu'à chaque fois que l'on va vouloir utiliser récuperer un élément, on va devoir le caster pour récuperer son type d'origine. Exemple : int* i = (int*)Stack_pop(pile). Et à la longue, ces casts qui ne sont pas implicites sont vraiment désagréables et redondant. Donc ma question, c'est est-ce qu'il existerait pas une astuce ou une méthode (basée sur les macros, par exemple, ou autre) qui permet de rendre ce cast automatique ?
Bien entendu, je sais qu'il suffirait pour cela de passer au C++ ... Mais je peux pas !
Merci de vos réponses !
++ & bonne année !
L.S.
LocalStone
Messages postés514Date d'inscriptionmercredi 19 mars 2003StatutMembreDernière intervention 1 mars 2009 9 janv. 2007 à 13:14
Alors d'abord, je suis pas trop sur de ce que tu viens de marquer parce que ne pas faire de cast provoque un warning à la compilation. Et de plus, j'ai mis un int* en exemple, mais ça pourrait être n'importe quoi, un float*, un char* ou gloubiboulga ...
++
L.S.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 9 janv. 2007 à 15:55
En C pur, il n'y a pas de warning pour une conversion de void* en int* (d'ailleurs en C, on ne caste jamais devant un malloc pour cette raison)
Pour le controle de type, c'est évident qu'il n'a pas lieu
LocalStone
Messages postés514Date d'inscriptionmercredi 19 mars 2003StatutMembreDernière intervention 1 mars 2009 10 janv. 2007 à 11:07
Bon, peut-être qu'il n'y a pas besoin de cast pour int*, mais pour les autres, si. Existe-t-il une solution pour éviter d'avoir à caster pour les autres types ?
L.S.