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);
}
?
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:
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.
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.
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.
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.
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.
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.
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
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.