Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 13/04/2010, à 07:45

amwus

[C++] Type de retour générique

Bonjour à tous !

Y a -t- il en C++ un moyen d'avoir un type de retour générique ? Je m'explique.
J'ai par exemple une classe Value qui contient soit un entier, soit un flottant.

J'aimerais pouvoir réaliser ce qui suit. Si j'ai un objet Value v1; j'aimerais que v1.val() me renvoie un int si la valeur stockée est bien entière, ou un float si la valeur stockée est flottante. Mais le tout avec une seule fonction val(). Est ce qu'une telle chose est possible ?

Pour l'instant, je suis obligé d'utiliser une fonction type() et de tester le type de retour à chaque fois. Ce qui me fait quelque chose comme ça :

int type = v1.type();

if (type == Val::INT) 
  int ret = v1.val().iType;
else if (type == Val::FLOAT)
  float ret = v1.val().fType;

où v1.val() renvoie en réalité une union qui contient un champ int et un champ float. Je cherche à éviter ça... Cela est-il possible ?

Merci !


Black holes are where god divided by zero...

Hors ligne

#2 Le 13/04/2010, à 08:14

Link31

Re : [C++] Type de retour générique

Non, ce n'est pas possible. Il faut bien que le compilateur sache quoi compiler...

Tu devrais plutôt voir du côté de classes telles que Boost.Any, qui permettent de stocker une valeur de type quelconque et de la récupérer avec un cast explicite.

Ensuite, tu peux toujours entourer cette classe d'un wrapper, muni d'une méthode "template <typename T> operator T();" qui fait la conversion, et renvoyer ce wrapper avec ta méthode val(). Il sera ainsi converti automatiquement dans le type attendu (ou lancera une exception). Attention tout de même, de telles conversions implicites finissent toujours par te jouer des tours.

Dernière modification par Link31 (Le 13/04/2010, à 08:15)

Hors ligne

#3 Le 13/04/2010, à 08:15

amwus

Re : [C++] Type de retour générique

Juste une petite précision... Je viens de penser à quelque chose qui pourrait fonctionner mais j'ai toujours le même problème du type de retour. Imaginons la situation suivante :

int type;

type_de_retour_inconnu getValue() {
  if (type == Val::INT) 
    return union.intType;
  
  else if (type == Val::FLOAT)
    return union.floatType;
}

Si je pouvais faire ça, ça serait parfait, mais quel doit être le type de retour de ma fonction getValue ?


Black holes are where god divided by zero...

Hors ligne

#4 Le 13/04/2010, à 16:26

Luc Hermitte

Re : [C++] Type de retour générique

Réponse de fainéant: http://forum.ubuntu-fr.org/viewtopic.php?id=332647

Hors ligne

#5 Le 14/04/2010, à 07:19

amwus

Re : [C++] Type de retour générique

hmm je ne comprend pas ... ce n'est pas vraiment le même problème si ?


Black holes are where god divided by zero...

Hors ligne

#6 Le 14/04/2010, à 07:24

Teofifil

Re : [C++] Type de retour générique

Bonjour,

Et en définissant ta variable comme un variant. Au pire tu peux aussi utiliser un double, tout dépend de ce que tu appelle un réel. Si c'est par exemple 2,36 un double peut te permettre de retourner une valeur que tu peux considérer comme entière et une valeur estimée être réelle (ie sans mantisse et exposant)

Dernière modification par Teofifil (Le 14/04/2010, à 07:28)

Hors ligne

#7 Le 14/04/2010, à 12:54

Link31

Re : [C++] Type de retour générique

En effet, je n'y ai pas pensé tout de suite, mais si les types possibles que peut prendre la variable sont connus à l'avance (et qu'il y en a un nombre raisonnable, disons une dizaine au maximum), une classe de variant comme Boost.Variant est très pratique.

Hors ligne