J'aimerais effectuer des calculs similaires, mais pas identiques pour plusieurs types d'entiers (16, 32, 64 bits) et des types de points flottants (flotteur, double, double double). La majeure partie du code est identique, mais certaines portions doivent être effectuées différemment pour les véhicules et les flotteurs. Par exemple, la comparaison des INT peut être effectuée avec un == B, alors que la comparaison des flotteurs doit être effectuée avec ABS (A-B)
Un moyen de le faire serait d'isoler les parties du code différents entre les intenses et les flotteurs en petites fonctions et le modèle de spécialisation pour chaque type. Cependant, je préférerais ne pas copier-coller un code identique pour chacun des types entier et un autre code pour chacun des types de flotteurs. Ainsi, la question: est-il possible de spécialiser la fonction de modèle pour plusieurs types à la fois? Quelque chose de sémantiquement similaire à ce qui suit si c'était légal: p>
3 Réponses :
avec C ++ 11 Il est possible d'utiliser Type Traits . Voir std :: activer_if code>
documentation
Dans votre cas, cela pourrait ressembler à ceci:
Paramètre de fonction Spécialisation: P>
template<class T> typename std::enable_if<std::is_integral<T>::value, bool >::type isEqual(T a, T b) { return a == b; } template<class T> typename std::enable_if<std::is_floating_point<T>::value, bool >::type isEqual(T a, T b) { return abs( a - b ) < epsilon; }
Alternativement, utilisez activer_if code> sur le type de retour, comme sur CPPreference (ceci empêche toute utilisation abusive), ou en tant que paramètre de modèle supplémentaire avec argument par défaut (mauvaise utilisation que lorsque vous spécifiez explicitement les arguments de modèle).
@Dyp merci, j'ai ajouté une autre possibilité
Vous pouvez spécialiser sur alors vous pouvez également grouper des fonctions basées sur des catégories p>
Oui, vous pouvez utiliser Sfinae en combinaison avec les métafonnes à partir de
En C ++ 11 (ou boost), il existe des traits de type tels que
STD: : is_floatinting_point code>
.