Introduction
La surcharge de fonctions en C implique généralement de différencier les fonctions en fonction de leurs types de paramètres . Cependant, il est également possible de surcharger les fonctions en fonction de leurs valeurs de retour. Cela vous permet de définir des fonctions qui renvoient différents types de données en fonction de la façon dont elles sont utilisées.
Énoncé du problème
Considérez la tâche suivante :
int n = mul(6, 3); // n = 18 std::string s = mul(6, 3); // s = "666"
Ici, vous devez définir une fonction nommée mul qui renvoie soit un entier, soit une chaîne, selon la valeur de retour de sa valeur. utilisé.
Approches de solution
Saisie explicite :
Une approche consiste à différencier explicitement les appels en tapant. Par exemple, vous pouvez définir deux fonctions distinctes :
int mul(int, int); std::string mul(char, int);
Et les appeler comme suit :
int n = mul(6, 3); // n = 18 std::string s = mul('6', 3); // s = "666"
Pointeur factice :
Un autre La méthode consiste à ajouter un paramètre factice à chaque fonction, obligeant le compilateur à choisir le bon. Par exemple :
int mul(int *, int, int); std::string mul(std::string *, char, int);
Et utilisez-les avec :
int n = mul((int *) NULL, 6, 3); // n = 18 std::string s = mul((std::string *) NULL, 54, 3); // s = "666"
Modèle de la valeur de retour (option 1) :
Vous pouvez créer une fonction "factice" avec du code qui ne sera pas compilé s'il est instancié. Ensuite, définissez des versions de modèles spécialisées pour les types de retour souhaités :
template<typename T> T mul(int, int); template<> int mul<int>(int, int); template<> std::string mul<std::string>(int, int);
Utilisez-les comme suit :
int n = mul<int>(6, 3); // n = 18 std::string s = mul<std::string>(54, 3); // s = "666"
Modèle de la valeur de retour (option 2) :
Pour les cas avec des paramètres différents, vous pouvez définir des spécialisations de modèles distinctes avec des types de paramètres distincts :
template<typename T> T mul(int, int); template<> int mul<int>(int, int); template<typename T> T mul(char, int); template<> std::string mul<std::string>(char, int);
Et appelez-les comme :
int n = mul<int>(6, 3); // n = 18 std::string s = mul<std::string>('6', 3); // s = "666"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!