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")); } }
3 Réponses :
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: p> mais si vous appelez cette fonction avec une variable non signée et deux entiers littéraux, par exemple: P> < Pré> xxx pré> Vous obtiendrez une erreur car le type ne peut pas être déduit - pour cela, tous les paramètres avec type Ceci peut être effectué par déduction de type désactivation em> pour le deuxième et troisième paramètre, En spécifiant leur type comme Votre définition de fonction devient alors p> ici, vous pouvez voir le code dans un Démo en direct Strong> . P> P> x code> doivent être passés une valeur exacte du même type.
Donc, déduire le type
x code> est ambigu et donc pas possible. Pour moi, il semble que vous souhaitiez déduire le type basé sur le premier paramètre em> étant passé (la "valeur réelle") et essayez simplement de convertir les limites sur ce même type em >. En d'autres termes, quelque chose qui ne vous oblige pas à écrire p>
identity_t
x code>, où
identitry_t code> est défini comme p>
Vous n'avez pas besoin de sfinae ou de spécialisation, vous avez juste besoin de ce mais qui nécessite que tous les arguments soient déduits au même type. P> Pour éviter que cela puisse forcer un argument à être non déductible: < / p> x code>,
y code>,
z code> avoir le même signe. Vous pouvez donc utiliser
Que diriez-vous de quelque chose comme ça?
Pourquoi avez-vous x, y et z? Toutes les valeurs ne doivent-elles pas être un i> de toute façon?
La comparaison signée à non signé est comparant les pommes aux oranges.