J'ai joué avec un ensemble de modèles pour déterminer le type de promotion correct étant donné deux types primitifs en C++. L'idée est que si vous définissez un modèle numérique personnalisé, vous pouvez les utiliser pour déterminer le type de retour, par exemple, de la fonction opérateur + en fonction de la classe transmise aux modèles. Par exemple:Utilisations d'un en-tête de promotion arithmétique C++
// Custom numeric class
template <class T>
struct Complex {
Complex(T real, T imag) : r(real), i(imag) {}
T r, i;
// Other implementation stuff
};
// Generic arithmetic promotion template
template <class T, class U>
struct ArithmeticPromotion {
typedef typename X type; // I realize this is incorrect, but the point is it would
// figure out what X would be via trait testing, etc
};
// Specialization of arithmetic promotion template
template <>
class ArithmeticPromotion<long long, unsigned long> {
typedef typename unsigned long long type;
}
// Arithmetic promotion template actually being used
template <class T, class U>
Complex<typename ArithmeticPromotion<T, U>::type>
operator+ (Complex<T>& lhs, Complex<U>& rhs) {
return Complex<typename ArithmeticPromotion<T, U>::type>(lhs.r + rhs.r, lhs.i + rhs.i);
}
Si vous utilisez ces modèles de promotion, vous pouvez plus ou moins traiter vos types définis par l'utilisateur comme si elles sont primitives avec les mêmes règles de promotion étant à leur appliquer. Donc, je suppose que la question que j'ai est serait-ce quelque chose qui pourrait être utile? Et si oui, quelles sortes de tâches communes voulez-vous modéliser pour la facilité d'utilisation? Je pars du principe que le simple fait d'avoir les modèles de promotion serait insuffisant pour une adoption pratique. Incidemment, Boost a quelque chose de similaire dans son en-tête math/tools/promotion, mais c'est vraiment plus pour obtenir des valeurs prêtes à être passées aux fonctions mathématiques standard C (qui attendent 2 ou 2 doubles) et contourner tous les les types intégraux. Est-ce quelque chose d'aussi simple que d'avoir un contrôle total sur la façon dont vos objets sont convertis? TL: DR: Quels types de modèles d'aide trouveriez-vous dans un en-tête de promotion arithmétique au-delà de la machine qui fait la promotion elle-même?
Je suppose qu'à la toute fin vous allez assigner le résultat promu joliment à une variable (de type différent), donc je ne vois pas beaucoup d'utilisation pratique pour cela. Peut-être avec ** auto ** en C++ 0x, mais je pense aussi que ** decltype ** peut prendre en charge la plupart des tâches plus facilement. – UncleBens
Comme il s'avère, cela sera implémenté en C++ 0x comme la structure CommonType, qui exploite decltype pour déterminer le type correct. Si quelqu'un veut un comportement complètement uniforme par rapport aux règles de la promotion/conversion, il devra simplement écrire les variations commutatives des modèles. – BenTrofatter