9
votes

Un moyen élégant de se débarrasser de la comparaison entre les expressions entière signées et non signées

J'ai les modèles ci-dessous:

On est utilisé pour non signé et l'autre pour la signature. Y a-t-il un moyen élégant de se débarrasser de l'avertissement du compilateur sans le supprimer? P>

template<typename X,typename Y,typename Z, typename std::enable_if<std::is_unsigned<X>::value, bool>::type = true >
void debugValidateParameter( X aValueToCheck, Y aLowerLimit, Z aUpperLimit)
{
   if( (aValueToCheck > aUpperLimit) || (aValueToCheck < aLowerLimit) )
   {
    log("ERROR: ValidateParameters, aValueToCheck = % , aLowerLimit= % , aUpperLimit= %  \n", aValueToCheck, aLowerLimit, aUpperLimit );
    throw(std::out_of_range("Invalid Range"));
   }
}

template<typename X,typename Y,typename Z, typename std::enable_if<std::is_signed<X>::value, bool>::type = true >
void debugValidateParameter( X aValueToCheck, Y aLowerLimit, Z aUpperLimit)
{
   if( (aValueToCheck > aUpperLimit) || (aValueToCheck < aLowerLimit) )
   {
    log("ERROR: ValidateParameters, aValueToCheck = % , aLowerLimit= % , aUpperLimit= %  \n", aValueToCheck, aLowerLimit, aUpperLimit );
    throw(std::out_of_range("Invalid Range"));
   }
}


2 commentaires

Pourquoi avez-vous x, y et z? Toutes les valeurs ne doivent-elles pas être un de toute façon?


La comparaison signée à non signé est comparant les pommes aux oranges.


3 Réponses :


12
votes

Permettez-moi d'expliquer un peu ce que vous avez eu mal ici.

Pour moi, on dirait que vous voudriez normalement utiliser le même type pour les trois paramètres. La solution la plus directe serait cette définition: xxx

mais si vous appelez cette fonction avec une variable non signée et deux entiers littéraux, par exemple: < Pré> xxx

Vous obtiendrez une erreur car le type ne peut pas être déduit - pour cela, tous les paramètres avec type x doivent être passés une valeur exacte du même type. Donc, déduire le type x est ambigu et donc pas possible. Pour moi, il semble que vous souhaitiez déduire le type basé sur le premier paramètre étant passé (la "valeur réelle") et essayez simplement de convertir les limites sur ce même type . En d'autres termes, quelque chose qui ne vous oblige pas à écrire xxx

Ceci peut être effectué par déduction de type désactivation pour le deuxième et troisième paramètre, En spécifiant leur type comme identity_t au lieu de juste x , où identitry_t est défini comme xxx

Votre définition de fonction devient alors xxx

ici, vous pouvez voir le code dans un Démo en direct .


0 commentaires

2
votes

Vous n'avez pas besoin de sfinae ou de spécialisation, vous avez juste besoin de ce x , y , z avoir le même signe. Vous pouvez donc utiliser xxx

mais qui nécessite que tous les arguments soient déduits au même type.

Pour éviter que cela puisse forcer un argument à être non déductible: < / p> xxx


0 commentaires

1
votes

Que diriez-vous de quelque chose comme ça? XXX


0 commentaires