2010-05-13 19 views
17

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?

risposta

20

La risposta è nel <type_traits>

Per la determinazione della firma-ness di uno std :: tipo uso is_signed e std :: is_unsigned

Per l'aggiunta/rimozione firmato-ness, v'è std :: make_signed e std :: make_unsigned

+0

+1 per "perché non ho pensato a quella" risposta. :) –

3

Se non puoi o non vuoi dipendere da TR1/C++ 0x caratteristiche, Boost.TypeTraits vi offre anche make_unsigned<> et al.

+0

+1 - come accade, sto usando Visual Studio 2005 che non supporta '' - quindi avere un'alternativa è a portata di mano. Ho ancora accettato '' come risposta dato che fa parte della libreria standard. –

+0

@Blair: Attento, questo in realtà * "farà parte di" * - fa parte del prossimo standard che non è ancora uscito. –

Problemi correlati