2016-04-22 9 views
0

Ich versuche zur Zeit eine kleine Vorlage zu implementieren, die den Typ folgert benötigt, um eine bestimmte Anzahl von Bits als Template-Parameter angegeben zu speichern:Werttyp Abzug von nicht-Typ Template-Parameter

template<unsigned char BITS> 
class Register 
{ 
public: 
    unsigned long type; 
}; 

Außerdem bin ich versuchen, diese Vorlage für bestimmte Bit-Größen spezialisiert:

template<> 
class Register<8> 
{ 
public: 
    unsigned char type; 
}; 

template<> 
class Register<16> 
{ 
public: 
    unsigned short type; 
}; 

template<unsigned int N> Register<N+1>; 

Leider ist dies nicht wie vorgesehen funktionieren und kompilieren fehlschlägt:

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Register<32>::type val32 = 0xDEADBEEF; 
    assert(sizeof(val) == sizeof(unsigned long)); 

    Register<16>::valType val16 = 0xBEEF; 
    assert(sizeof(val) == sizeof(unsigned short)); 

    Register<8>::valType val8 = 0xEF; 
    assert(sizeof(val) == sizeof(unsigned char)); 

    Register<4>::valType val4 = 0xF; 
    assert(sizeof(val) == sizeof(unsigned char)); 

    return 0; 
} 

Vielleicht kann jemand mir einen Zeiger auf einen hilfreichen Text geben oder mir sagen, was ist los mit meinem Ansatz?

Antwort

5

Sie wollen ein Typ Mitglied, keine Daten Mitglied:

template <std::size_t N> struct Register 
{ 
    using type = unsigned long int; 
}; 

template <> struct Register<8> 
{ 
    using type = unsigned char; 
}; 

// ... 

Verbrauch:

template <typename T> void f() 
{ 
    typename Register<sizeof(T) * CHAR_BIT>::type thing; 
    // ... 
} 
+0

Dank. Das habe ich total übersehen. Kann diese Vorlage generisch auf alle anderen Parameterwerte (1-32) erweitert werden? Das bedeutet, dass z.B. Register <17> wählt automatisch das Register <32> Deklaration? – fhw72

+1

@ fhw72: Sicher. Sie können einen Zwischen-Dispatching-Mechanismus verwenden, der auf den nächsten implementierten Wert usw. springt. –

+0

Kann dies auch zur Kompilierzeit erreicht werden? Wie Register verwendet Register .... und so weiter und schließlich "schnappt" bei der nächsten explizit definierten Vorlage? – fhw72