web-dev-qa-db-fra.com

Surcharge par type de retour

J'ai lu quelques questions ici sur SO sur ce sujet qui me semble encore déroutant. Je viens tout juste de commencer à apprendre le C++ et je n’ai pas encore étudié les modèles, ni la surcharge d’opérateurs, etc.

Y at-il maintenant un moyen simple de surcharger

class My {
public:
    int get(int);
    char get(int);
}

sans modèles ou comportement étrange? ou devrais-je juste 

class My {
public:
    int get_int(int);
    char get_char(int);
}

?

63
Shoe

Non il n'y en a pas. Vous ne pouvez pas surcharger les méthodes en fonction du type de retour.

La résolution de surcharge prend en compte la signature function. Une signature de fonction est composée de:

  • nom de la fonction
  • qualificatifs cv
  • types de paramètres

Et voici la citation:

1.3.11 signature

les informations sur une fonction qui participe à la surcharge résolution (13.3): sa liste de types de paramètres (8.3.5) et, si le fonction est un membre de la classe, les qualificatifs cv (le cas échéant) de la fonction lui-même et la classe dans laquelle la fonction membre est déclarée. [...]

Options:

1) changer le nom de la méthode:

class My {
public:
    int getInt(int);
    char getChar(int);
};

2) paramètre out:

class My {
public:
    void get(int, int&);
    void get(int, char&);
}

3) les modèles ... excessifs dans ce cas.

86
Luchian Grigore

C'est possible, mais je ne suis pas sûr que ce soit une technique que je recommanderais aux débutants. Comme dans d'autres cas, lorsque vous souhaitez que le choix des fonctions dépende de l'utilisation de la valeur de retour, vous utilisez un proxy; Commencez par définir les fonctions .__ telles que getChar et getInt, puis un get() générique, qui renvoie un proxy comme celui-ci: 

class Proxy
{
    My const* myOwner;
public:
    Proxy( My const* owner ) : myOwner( owner ) {}
    operator int() const
    {
        return myOwner->getInt();
    }
    operator char() const
    {
        return myOwner->getChar();
    }
};

Étendez-le à autant de types que vous avez besoin.

68
James Kanze

Non, vous ne pouvez pas surcharger par type de retour; uniquement par types de paramètres et qualificatifs const/volatile.

Une alternative serait de "retourner" en utilisant un argument de référence:

void get(int, int&);
void get(int, char&);

bien que j'utiliserais probablement un modèle ou des fonctions nommées différemment, comme votre deuxième exemple.

8
Mike Seymour

Vous pouvez penser de cette façon:

Tu as:

  int get(int);
  char get(int);

Et, il n'est pas obligatoire de collecter la valeur de retour de la fonction lors de l'appel. 

Maintenant, vous invoquez

  get(10);  -> there is an ambiguity here which function to invoke. 

Donc, aucune signification si la surcharge est autorisée en fonction du type de retour.

4
Whoami

Il n'y a aucun moyen de surcharger par type de retour en C++. Sans utiliser de modèles, utiliser get_int et get_char sera la meilleure solution.

2
sepp2k

Vous ne pouvez pas surcharger les méthodes en fonction des types de retour. Votre meilleur choix est de créer deux fonctions avec une syntaxe légèrement différente, comme dans votre deuxième extrait de code.

2
Frecklefoot

Bien que la plupart des autres commentaires sur ce problème soient techniquement corrects, vous pouvez efficacement surcharger la valeur de retour si vous la combinez avec un paramètre d'entrée de surcharge. Par exemple:

class My {
public:
    int  get(int);
    char get(unsigned int);
};

DEMO:

#include <stdio.h>

class My {
public:
    int  get(         int x) { return 'I';  };
    char get(unsinged int x) { return 'C';  };
};

int main() {

    int i;
    My test;

    printf( "%c\n", test.get(               i) );
    printf( "%c\n", test.get((unsigned int) i) );
}

Le résultat de ceci est:

I 
C
2
codechimp

vous ne pouvez pas surcharger une fonction en fonction du type de retour de la fonction. Vous pouvez vous superposer en fonction du type et du nombre d’arguments utilisés par cette fonction.

0
AlexDan