kleine Funktion geschrieben (sehr kleine)
-
Hi,
gar nicht schlecht die Idee.
i ist die Größe des Arrays und wird als Templateparameter nicht explizit mitgegeben. Implizit aber schon und dann ist i nach wie vor ein Wert, der zurückgegeben werden kann.
Aber klappt das echt so?MfG Eisflamme
-
CarstenJ schrieb:
Hallo,
otze schrieb:
template<class T,int i> int countem(T (&pArr)[i]) { return i; }
das ding kann ein array jedes typs zählen.
den Code verstehe ich nicht. Wo wird da was gezählt? Kannst du das bitte mal erklären?
ok, ganz einfach:
du hast ein array: char array[5];
dann ist während der compiletime dem compiler bekannt, dass das array aus 5 chars besteht, denn [5] ist ein teil des typbezeichners(das ist auch der grund, weshalb man keine normale pointer zu nem array typ casten kann), und typbezeichner kann man via templates problemlos abfragen.natürlich hast du recht, es wird nicht gezählt, sodnern eher die größe abgefragt, aber es läuft aufs selbe hinaus.
-
otze schrieb:
template<class T,int i> int countem(T (&pArr)[i]) { return i; }
das ding kann ein array jedes typs zählen.
Das funktioniert jetzt auch für Arrays auf dem Heap?
-
nein
-
ich zitier mich mal selber:
mit new erstellten speicher kannst du übrigens nicht zählen.
der grund: ein new char[5]
liefert nur einen char* zurück, keinen char [5]
-
Korrekterweise sollte die Funktion allerdings wie folgt aussehen
template<class T, std::size_t N> std::size_t countem(T (&)[N]) { return N; }
-
großes N? net so doll aber mit size_t haste recht, dachte nur, man könnte so einen fehlerwert angeben, wenn zb ein normaler pointer übergeben wird...
-
bis die werte so gross geworden sind hätte man vermutlich eh schon den stack abgeschossen...
-
otze schrieb:
großes N? net so doll
Wie du's nennst ist ja letztendlich egal. Mir gings nur um size_t.
otze schrieb:
dachte nur, man könnte so einen fehlerwert angeben, wenn zb ein normaler pointer übergeben wird...
Wenn du einen Zeiger übergibst, sollte dein Compiler eigentlich meckern, und das ist besser als ein Fehlerwert, der hier imo keinen Sinn macht.
Windalf schrieb:
bis die werte so gross geworden sind hätte man vermutlich eh schon den stack abgeschossen...
Darum geht es überhaupt nicht. Lass dich mal von kingruedi aufklären, wofür size_t verwendet wird. Oder schau dir einfach mal den Rückgabewert von sizeof an.
-
Darum geht es überhaupt nicht. Lass dich mal von kingruedi aufklären, wofür size_t verwendet wird. Oder schau dir einfach mal den Rückgabewert von sizeof an
na das ist ja schon fast akademisch.... je kleiner sizeof(size_t) auf nem system ausfallen wird desto kleiner wird auch tendenziell der arbeitsspeicher auf dem system sein und umgekehrt(und damit auch der stack) ich glaub kaum das es nen kompiler gibt der nen 8 bit int auf nem 32 bit rechner umsetzt...
-
Es geht nicht darum wie groß sizeof(size_t) ist... Der sizeof-Operator gibt ein size_t zurück!
-
Es geht nicht darum wie groß sizeof(size_t) ist... Der sizeof-Operator gibt ein size_t zurück
versteh ich immer noch nicht was jetzt daran toller sein soll...(die gefahr das der zurückgelieferte wert nicht in ein int passt wirds ja wohl kaum sein)
bitte erklärts mir und lasst mich nicht doof sterben...
-
es geht nur um einheitlichkeit, dass alle größen angaben in size_t erfolgen sollten. Obwohl..einheitlichkeit...sizeof gibt die exakte größe in byte zurück, unsere funktion nur eine relative größe eines arrays...naja mir schnuppe^^
-
Und dann könnte die Funktion gleich const T (&)[N] annehmen... Das funktioniert nicht mit dynamischen Arrays, aber immerhin bemerkt man den Fehler schon beim Kompilieren. kA warum diese praktische Funktion nicht im Standard ist.
-
zu der zeit, als der standard geschrieben wurde, insbesondere die STL, war die meta template programmierung noch in ihren Kinderschuhen, das wird wohl der grund gewesen sein.
-
Windalf schrieb:
je kleiner sizeof(size_t) auf nem system ausfallen wird desto kleiner wird auch tendenziell der arbeitsspeicher auf dem system sein und umgekehrt(und damit auch der stack) ich glaub kaum das es nen kompiler gibt der nen 8 bit int auf nem 32 bit rechner umsetzt...
Keine Ahnung was du uns hiermit sagen willst. Aber size_t wird so definiert, dass du auch den maximalen Speicher damit ansprechen kannst. Keine Ahnung, ob du das mit int auf 64 Bit Systemen auch kannst.
Windalf schrieb:
versteh ich immer noch nicht was jetzt daran toller sein soll...(die gefahr das der zurückgelieferte wert nicht in ein int passt wirds ja wohl kaum sein)
siehe oben
Ich will jetzt nicht schon wieder 'ne Diskussion vom Zaun brechen, aber size_t nicht zu benutzen hat einige Nachteile. Ich für meinen Teil ärgere mich immer masslos, wenn ich Fremdcode compiliere und 1001 Warnungen wegen signed/unsigned Mismatch bekomme. Und nur weil ich mit dem höchsten Warnlevel compiliere. Sowas ist nicht nur ärgerlich, sondern sind auch potentielle Fehlerquellen.
Glücklicherweise sehe ich immer mehr Leute size_t benutzen. Selbst Microsoft hat in seiner WinAPI einen size_t Typ. Der heisst dann logischerweise SIZE_T.Die definieren SIZE_T dann zB so, dass er die gleiche Breite wie ein Zeiger hat.
Wenn's dich wirklich interessiert, dann such mal im Forum, da gibts schon genügend Stoff dazu.
-
otze schrieb:
CarstenJ schrieb:
Hallo,
otze schrieb:
template<class T,int i> int countem(T (&pArr)[i]) { return i; }
das ding kann ein array jedes typs zählen.
den Code verstehe ich nicht. Wo wird da was gezählt? Kannst du das bitte mal erklären?
natürlich hast du recht, es wird nicht gezählt, sodnern eher die größe abgefragt, aber es läuft aufs selbe hinaus.
Wow, ist ja echt genial. Muss mich wohl auch mal damit auseinandersetzen. In welchem Buch wird dann sowas ausführlich erklärt?
-
ich hab mit modern c++ design begonnen, dann ein bischen in boost gesucht,einen abstecher in die expression templates gemacht,und vorallem viel selbst ausprobiert.
-
CarstenJ schrieb:
Wow, ist ja echt genial. Muss mich wohl auch mal damit auseinandersetzen. In welchem Buch wird dann sowas ausführlich erklärt?
Eigentlich reicht es manchmal, die Forensuche hier zu benutzen.
Ich kann mich erinnern, dass das schon mal jemand gepostet hat. Weiss leider nicht mehr, wer das war.
-
Naja, mich hats trotzdem umgehauen.