PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ und Int-Templates


Gast
2008-02-04, 09:35:56
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

Coda
2008-02-04, 14:52:29
Template-Spezialisierung evtl.

std::bitset verwendet normalerweise immer multiple von 4 Bytes.

Gast
2008-02-05, 15:07:27
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;
};

Gast
2008-02-14, 13:55:56
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.

Gast
2008-02-14, 14:55:17
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;

Gast
2008-02-14, 15:28:51
Ah, super. Großartig was mit Templates alles geht.