6
votes

Distinguer l'entier des types de points flottants dans un modèle

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: xxx


1 commentaires

En C ++ 11 (ou boost), il existe des traits de type tels que STD: : is_floatinting_point .


3 Réponses :


18
votes

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;
}


2 commentaires

Alternativement, utilisez activer_if 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é



2
votes

Vous pouvez spécialiser sur

alors vous pouvez également grouper des fonctions basées sur des catégories xxx


0 commentaires

3
votes

Oui, vous pouvez utiliser Sfinae en combinaison avec les métafonnes à partir de xxx


0 commentaires