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?
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
@ fhw72: Sicher. Sie können einen Zwischen-Dispatching-Mechanismus verwenden, der auf den nächsten implementierten Wert usw. springt. –
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