#include <iostream>
using namespace std;
template <class X, class Y>
Y big(X a, Y b)
{
if (a > b)
return (a);
else return (b);
}
int main()
{
cout << big(32.8, 9);
}
Ici, j'utilise des modèles dans CPP, donc quand j'appelle la fonction en big
contournant les arguments de double
et int
type, je veux la réponse de retour qui estdouble
. Le type ici, il renvoie 32
au lieu de 32.8
.
Comment obtenir la sortie souhaitée? Comment écrire un type de big
fonction de retour approprié ?
c++
function
templates
return-type
function-templates
Rakshanda Meshram
la source
la source
std::max
est mis en œuvre. Le type de retour d'une fonction doit être connu au moment de la compilation en C ++. Vous ne pouvez donc pas faire dépendre ce type de retour de la valeur d'exécution de vos paramètres. C'est pourquoi pour une telle fonction, vous avez besoin des deux paramètres pour avoir le même type (c'est-à-dire, avoir le type X, mais pas Y).Réponses:
Une fonction ne peut avoir qu'un seul type de retour qui doit être connu au moment de la compilation. Cependant, vous pouvez utiliser
std::common_type
pour renvoyer un type dans lequel les deux paramètres peuvent être convertis implicitement.Ce serait
Et pour vérifier qu'il retourne réellement un
double
lorsqu'il est passé unint
et un,double
nous pouvons le faire:Qui imprime
PS:
std::common_type
peut utiliser l'opérateur ternaire derrière les scences et en tant que telle, cette solution n'est pas très différente des autres réponses (auto
+ ternaire). Le vrai pouvoir destd::common_type
c'est qu'il accepte n'importe quel nombre de paramètres.la source
Le type de retour doit être déterminé au moment de la compilation. Vous pouvez utiliser le retour de fin avec un opérateur conditionnel , si vous êtes limité à c ++ 11 .
Voir en direct
Cependant, si vous avez accès à c ++ 14 ou un
auto
retour supérieur est suffisant, car le compilateur déduira le bon type si vous l'utilisez avec l'opérateur conditionnel comme suit:Voir en direct
la source
const
).En marquant votre type de retour comme
Y
et en passant unint
comme second paramètre, vous avez clairement indiqué qu'ilY
s'agit d'unint
. Il n'y a pas de surprise ici.Cela imprime les quatre valeurs correctes à l'écran.
https://godbolt.org/z/fyGsmo
Une chose importante à noter est que cela ne fonctionnera que pour les types qui peuvent être comparés les uns aux autres, c'est-à-dire que le compilateur convertira implicitement un type en un autre pour la comparaison.
IMPORTANT : Les paramètres doivent être pris par référence pour éviter un comportement indéfini. Cela a à voir avec le type de retour que je tiens obstinément.
decltype(auto)
peut renvoyer des références aux types. Si vous renvoyez quelque chose de local à la fonction (nombre d'arguments), vous obtenez un comportement indéfini.la source
Ce n'est pas la bonne solution pour votre situation précise, selon toute vraisemblance - les autres réponses seront probablement beaucoup plus proches de ce que vous voulez.
Cependant, si vous avez vraiment besoin de retourner des types entièrement différents au moment de l'exécution pour une raison quelconque, la bonne solution (depuis c ++ 17 ) consiste à utiliser a
std::variant
, qui est une sorte d'union de type sécurisé.Notez qu'alors il incombe à l'appelant de traiter la valeur retournée, très probablement en utilisant
std::visit
ou similaire.la source
Il retourne int car Y est un int et il lui envoie le 32.8. Lorsque vous appelez big 32,82 est un flottant, mais 8 est un int et le type de retour de la fonction est Y, qui est également int.
Vous ne pouvez pas vraiment résoudre ce problème car vous devez savoir à l'exécution quel type de gros retours, alors faites a et b le même type comme ceci:
la source