Sto cercando di definire una classe template il cui parametro template sarà sempre un tipo intero. La classe conterrà due membri, uno di tipo T
e l'altro come variante non firmata di tipo T
- ad esempio T == int
, quindi T_Unsigned == unsigned int
. Il mio primo istinto era quello di fare questo:Ottieni la variante firmata/non firmata di un parametro del modello intero senza tratti espliciti
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;
};
Ma non funziona. Allora ho pensato di usare modello di specializzazione parziale, in questo modo:
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;
/* ... */
};
Questo funziona, a patto che si specializzano in parte UnsignedType
per ogni tipo intero. È un po 'più di lavoro di copia-incolla aggiuntivo (barra di uso giudizioso di macro), ma funzionale.
Tuttavia, ora sono curioso: esiste un altro modo per determinare la firma di un tipo intero e/o l'utilizzo della variante senza segno di un tipo, senza dover definire manualmente una classe di caratteri Tratti? O è questo l'unico modo per farlo?
+1 per "perché non ho pensato a quella" risposta. :) –