30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

f<strong>in</strong>dMax f o r <strong>in</strong>t32 array . . . max value i s at <strong>in</strong>dex 3<br />

f<strong>in</strong>dMax f o r double array . . . max value i s at <strong>in</strong>dex 0<br />

13.1 Function Templates 409<br />

Was tut der Compiler also h<strong>in</strong>ter den Kulissen, dass wir e<strong>in</strong>e generische Funktion<br />

e<strong>in</strong>fach so aufrufen können und <strong>in</strong> Wirklichkeit den Aufruf e<strong>in</strong>er konkreten<br />

Funktion damit erreichen? Pr<strong>in</strong>zipiell geht er nach folgendem Schema<br />

vor:<br />

1. Beim Aufruf e<strong>in</strong>er Template Funktion wirft er e<strong>in</strong>en Blick auf deren Deklaration,<br />

um herauszuf<strong>in</strong>den, was denn die generischen Teile des Templates<br />

s<strong>in</strong>d (davon kann es natürlich mehrere geben...). In unserem Fall gibt<br />

es den Datentyp ElementType, der e<strong>in</strong>e konkrete Entsprechung braucht.<br />

2. Die Aufrufparameter werden mit den generischen Teilen des Templates<br />

verglichen. Dadurch erfährt der Compiler, welche Entsprechung er konkret<br />

nehmen soll. In Zeile 15 unseres Testprogramms f<strong>in</strong>det der Compiler<br />

heraus, dass ElementType wohl <strong>in</strong>t32 se<strong>in</strong> muss, denn die Funktion<br />

wird mit e<strong>in</strong>em <strong>in</strong>t32 * aufgerufen und im Template steht als Parameter<br />

ElementType *. Wenn ElementType also für <strong>in</strong>t32 steht, passt alles<br />

wunderbar zusammen.<br />

3. Jetzt, wo der Compiler herausgefunden hat, was ElementType ist, geht er<br />

daran, im gesamten Funktionsrumpf alle Vorkommen dieses generischen<br />

Typs durch den konkreten Typ <strong>in</strong>t32 zu ersetzen. Er bastelt also e<strong>in</strong>e<br />

konkrete Funktion für diesen Typ.<br />

4. Die resultierende konkrete Funktion wird danach vom Compiler übersetzt,<br />

als ob wir selbst e<strong>in</strong>e Funktion geschrieben hätten, die mit e<strong>in</strong>em<br />

<strong>in</strong>t32 Array arbeiten würde.<br />

5. Der Aufruf der konkreten Funktion wird nun endgültig an der Stelle<br />

e<strong>in</strong>gesetzt, an der wir mit f<strong>in</strong>dMax <strong>in</strong> dieser Ausprägung arbeiten.<br />

Ganz genau dasselbe passiert <strong>in</strong> Zeile 18, nur dass hier die Analyse der generischen<br />

Parameter ergibt, dass der konkrete Datentyp e<strong>in</strong> double ist. Der<br />

Compiler erzeugt also e<strong>in</strong>e neue konkrete Ausprägung der Funktion, die mit<br />

e<strong>in</strong>em double Array arbeiten kann und setzt diesen Aufruf e<strong>in</strong>. Natürlich<br />

wird nicht jedes Mal, wenn der Compiler z.B. auf e<strong>in</strong>en double stößt, wieder<br />

e<strong>in</strong>e neue Ausprägung der Funktion erzeugt, denn die besondere Ausprägung<br />

mit double existiert ja nach dem ersten Vorkommen schon. Es wird ab dem<br />

zweiten Vorkommen e<strong>in</strong>fach diese existente Ausprägung herangezogen. Genaueres<br />

dazu wird noch <strong>in</strong> Abschnitt 13.7 behandelt.<br />

Geht man dieses Schema, wie der Compiler mit Templates arbeitet, noch<br />

e<strong>in</strong>mal im Kopf durch, dann erkennt man schnell, warum ich hier die gesamte<br />

Def<strong>in</strong>ition der Funktion e<strong>in</strong>mal kurzerhand quasi als <strong>in</strong>l<strong>in</strong>e Code <strong>in</strong> das<br />

Header File geschrieben habe: Der Compiler muss die Def<strong>in</strong>ition der Funktion<br />

kennen, um aus dieser generischen Def<strong>in</strong>ition auch e<strong>in</strong>e konkrete Ausprägung<br />

durch Ersetzen des Typs bauen und danach übersetzen zu können. Ich möchte<br />

allerd<strong>in</strong>gs hier gleich vorausschicken, dass dies im Pr<strong>in</strong>zip notgedrungen so<br />

se<strong>in</strong> muss, dass es aber zum Glück trotzdem Möglichkeiten gibt, wie man die

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!