Je cherche à définir une classe modèle dont le paramètre template sera toujours un type entier. La classe contiendra deux membres, l'un de type T
, et l'autre comme variante non signée de type T
- c'est-à-dire si T == int
, puis T_Unsigned == unsigned int
. Mon premier réflexe était de faire ceci:Obtenir la variante signée/non signée d'un paramètre de modèle entier sans traits explicites
template <typename T> class Range {
typedef unsigned T T_Unsigned; // does not compile
public:
Range(T min, T_Unsigned range);
private:
T m_min;
T_Unsigned m_range;
};
Mais cela ne fonctionne pas. Je me suis alors pensé à utiliser la spécialisation de modèle partiel, comme suit:
template <typename T> struct UnsignedType {}; // deliberately empty
template <> struct UnsignedType<int> {
typedef unsigned int Type;
};
template <typename T> class Range {
typedef UnsignedType<T>::Type T_Unsigned;
/* ... */
};
Cela fonctionne, tant que vous vous spécialisez partiellement UnsignedType
pour chaque type entier. C'est un peu plus de travail de copier-coller (slash utilisation judicieuse des macros), mais réparable.
Cependant, je suis curieux: existe-t-il un autre moyen de déterminer la signature d'un type entier et/ou d'utiliser la variante non signée d'un type sans avoir à définir manuellement une classe Traits? Ou est-ce la seule façon de le faire?
+1 pour "pourquoi n'ai-je pas pensé à cela" réponse. :) –