Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ und Int-Templates
hallo
Kann ich eine Klasse dfg<15>, dfg<25>, dfg<6> so implementieren, daß darauf ein Datentyp gewählt wird, der möglichst klein ist? Also bei dfg<int I> und I<16, nimm short, I<32 nimm int, I<8 nimm byte/char.
Bzw. wie macht das std::bitset dies?
danke
Template-Spezialisierung evtl.
std::bitset verwendet normalerweise immer multiple von 4 Bytes.
Heißt das ich muß für jede Möglichkeit 1,2,3,4,... eine eigene Spezialisierung machen? Das wäre zumindest etwas unpraktisch...
Corrail
2008-02-12, 13:05:27
du könntest es etwa so machen:
template<int BIT>
class bit_datatyp
{
public:
typedef bit_datatype<BIT+1>::TYPE TYPE;
};
template<>
class bit_datatyp<8>
{
public:
typedef char TYPE;
};
template<>
class bit_datatyp<8>
{
public:
typedef short TYPE;
};
Danke, das sieht ja heiß aus - ist das ein rekursives Template? Was passiert, wenn man einen Wert größer als den höchsten Spezialisierungsfall wählt; kommt der Compiler dann in eine Endlosschleife? :)
Corrail
2008-02-14, 14:05:07
Danke, das sieht ja heiß aus - ist das ein rekursives Template? Was passiert, wenn man einen Wert größer als den höchsten Spezialisierungsfall wählt; kommt der Compiler dann in eine Endlosschleife? :)
Genau, das ist ein rekursives Template. Aber du brauchst dir keine Sorgen bezüglich Endlosschleife im Compiler machen, der Compiler hat eine maximale Templaterekursionstiefe.
Danke, wobei Visual Studio .NET als auch gcc habe bei mir Probleme mit dieser Zeile:
typedef bit_datatype<BIT+1>::TYPE TYPE; kommt bloß ein simples "Fehlendes ; vor Bezeichner TYPE", aber auch nicht sehr aussagekräftig.
Corrail
2008-02-14, 15:01:09
Danke, wobei Visual Studio .NET als auch gcc habe bei mir Probleme mit dieser Zeile:
typedef bit_datatype<BIT+1>::TYPE TYPE; kommt bloß ein simples "Fehlendes ; vor Bezeichner TYPE", aber auch nicht sehr aussagekräftig.
Das hab ich mir gedacht, dass es hier zu Problemen kommen kann... Mein Code oben war ein wenig schlampig geschrieben. Genau genommen musst du in diesem Fall dem Compiler explizit sagen, dass das, was nach dem typedef kommt auch ein Typ ist. Das tust du mit dem Keyword "typename":
typedef typename bit_datatype<BIT+1>::TYPE TYPE;
Ah, super. Großartig was mit Templates alles geht.
vBulletin®, Copyright ©2000-2025, Jelsoft Enterprises Ltd.