Spezialisierung bei Klassentemplates
-
Hallo zusammen,
momentan stehe ich ein wenig auf dem Schlauch. Wie schon oben angegeben geht es um Spezialisierung von Klassentemplates. Bei der Wikipedia habe ich folgendes gefunden:
Die Containerklasse std::vector der C++-Standardbibliothek kann für den Elementtyp bool als 'Bitmap' implementiert werden, was hilft Speicherplatz einzusparen.
Auch entnimmt das Klassentemplate std::basic_string die Informationen zum Umgang mit den einzelnen Zeichen der Struktur char_traits, die für den Datentyp char und beispielsweise auch wchar_t spezialisiert ist.Die Deklaration von Spezialisierungen ähnelt der von normalen Templates, allerdings sind die dem Schlüsselwort template folgenden spitzen Klammern leer, und dem Funktions- bzw. Klassennamen folgen die Templateparameter.
Beispiel:
template <> class vector< bool > { // Implementierung von vector als Bitmap };Könnt ihr mir sagen, wann ich dieses nutze bzw. wann am besten?
Viele Grüße
MM
-
Das ist schon fertig so. Es gibt bereits eine spezialisierte Version für
bool.Also wenn Du es benutzen willst einfach
std::vector<bool> vecschreiben.
-
Wenn du eine bestimmte Implementierung/Verhalten für einen bestimmten Typen haben möchtest. Oder aber um alleine nur ein paar Typen zu ermöglichen.
Wie eben z.B das std::vector<bool>. Bool hat ja üblicherweise 1 Byte, als 8 Bit und braucht somit 8x mehr Speicher, als nötig wären, da ja nur 2 Zustände möglich sind. Wenn du jetzt einen Container ala std::vector schreibst, machst du den zuerst einmal schön Allgemein. Dann merkst du aber irgedwann, dass wenn du einen std::vector<bool> hast, dass du den um einiges Speicher sparender implementieren kannst. Und dann kannst du eine spezielle Implementierung genau dafür schreiben, ohne, dass der Benutzer das merkt. (Man kann sich Spezialisierung, wie ein if zur Compilezeit vorstellen).
Oder, wie ich bereits angetönt habe nur um ein paar mögliche Typen anzubieten:
template <class T> class vector2d{}; template <> class vector2d<float>{...}; template <> class vector2d<int>{...};Es macht hier nicht viel Sinn, wenn man einen 2 Dimensionalen vector von "Haus" hat, daher macht man sie nur für ein paar Typen zugänglich. Wenn man einen anderen Typen nimmt, kommt keine Spezialisierung zu tragen und es gibt (wenn man eine Member benutzt) einen Compile Fehler.
Da das allerdings zu Codeduplizierung führen kann, wird diese "macht-kein-Sinn-Aspekt" vernachlässigt und geht davon aus, dass der Benutzer selbst merkt, dass es nicht viel Sinn macht einenvector2d<Hund>zu instanzieren. (wo es unter Umständen ja sogar ebenfalls einen Compie Fehler gibt).
-
Ich glaub ich habe es. Es dient einfach dazu einen Typ besonders zu behandeln.
Richtig?Viele Grüße
MM
-
MrMilk schrieb:
Ich glaub ich habe es. Es dient einfach dazu einen Typ besonders zu behandeln.
Richtig?Korrekt.
-
Danke. Eine Frage ist noch offen.
Müssen die spitzen Klammern dabei immer leer sein, sprich alle Parameter nach dem Templeklassennamen kommen oder ist es auch möglich nur erste bzw. letzten x Parameter zu spezialisieren?
Viele Grüße
MM
-
MrMilk schrieb:
Danke. Eine Frage ist noch offen.
Müssen die spitzen Klammern dabei immer leer sein, sprich alle Parameter nach dem Templeklassennamen kommen oder ist es auch möglich nur erste bzw. letzten x Parameter zu spezialisieren?
Viele Grüße
MMJup, das geht. Nennt sich partial template specialization.
-
In diesem Artikel erhältst du eine Einführung in die Templates, du kannst ihn ja mal lesen. Sei dir allerdings im Klaren, dass die Möglichkeiten, die durch die Programmierung mit Templates entstehen, nahezu unbegrenzt sind (Stichwort Metaprogrammierung).

-
Oh, da haben wir uns missverstanden.
Statt einem konkreten Wert meine ich dass nur einige Typen konkret angegeben sind:
template < typename T > class example<int, T, double> { //Implementierung };Darüber habe ich aber noch nichts gefunden, bin mir jetzt nicht sicher ob nichts gefunden mit nicht möglich gleich ist

Viele Grüße
MM
-
Hättest mal nach "partial template specialisation" gegooglet, wie dir drakon mitgeteilt hat

http://www.cprogramming.com/tutorial/template_specialization.html
//edit der erste Link sah gut aus, wars dann aber doch nicht...
-
MrMilk schrieb:
Eine Frage ist noch offen.
[...]*seufz*
Solche Grundlagen kann man übrigens auch in Büchern nachlesen.
-
Hallo otze,
danke für den Link. Ich hatte nicht danach gegoogelt, da ich in der Annahme war, dass "partial template specialisation" dieses: [url]http://de.wikipedia.org/wiki/Template_(Programmierung)#Partielle_Spezialisierung [/url] ist und es von meiner Seite einfach falsch verstanden wurde.
Viele grüße
MM
-
Lieber Herr Sebastian Pizer,
bitte beachten Sie im allgemeinen meine Beträge nicht mehr. Sie ärgern sich über mich und ich ärgere mich über Sie. Mit dieser Lösung ist die Zufriedenheit des einzelnen deutlich gesteigert.
Mit freundlichen Grüßen,
MM
-
Er ärgert sich nicht über dich, sondern stellt (so leid es mir tut) Tatsachen auf den Tisch.
Solche Sachen sind nun mal in Grundlagen Büchern vorhanden und sollten in erster Linie von dort gelernt werden.Es ist ja keine Schande das hier zu Fragen, aber spätestens, wenn man dir sagt, dass man so Zeugs in Büchern findet, dann solltest du dich daran machen ein solches zu erwerben. Oder zumindest ein pdf runterladen.
Wie z.B hier:
http://www.mindview.net/Books/TICPP/ThinkingInCPP2e.html
-
drakon schrieb:
Er ärgert sich nicht über dich, sondern stellt (so leid es mir tut) Tatsachen auf den Tisch.
Solche Sachen sind nun mal in Grundlagen Büchern vorhanden und sollten in erster Linie von dort gelernt werden.Es ist ja keine Schande das hier zu Fragen, aber spätestens, wenn man dir sagt, dass man so Zeugs in Büchern findet, dann solltest du dich daran machen ein solches zu erwerben. Oder zumindest ein pdf runterladen.
Dem kann ich mich nur anschließen. Es ist zwar lobesam, wenn Leute C++ lernen wollen, und die Leute hier im Forum helfen auch gerne wenn es um echte Probleme geht. Wenn das Problem aber scheinbar nur das ist, dass die Leute sich nicht ernsthaft mit ein oder zwei Büchern/Tutorials zu den Grundlagen beschäftigen wollen, dann ist das auf Dauer nur ärgerlich und motiviert nicht zum Helfen.
-
Hallo zusammen,
eine Nacht ist vergangen und oft ändert dieses einiges. Ich sehe ein, dass meine Reaktion falsch und nicht angemessen war. Somit möchte ich mich im besonderen bei Sebastian Pizer entschuldigen.
Um in Zukunft meine Rate an überflüssigen Fragen zu senken, gebe ich an, welche Tutorials ich zuvor zum dem Thema gelesen habe.Viele Grüße
MM