30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

13.1 Function Templates<br />

13.1 Function Templates 407<br />

Um Lesern, die bisher noch ke<strong>in</strong>e Erfahrung mit generischer Programmierung<br />

sammeln konnten, e<strong>in</strong>en sanften E<strong>in</strong>stieg zu bieten, wenden wir uns zuerst<br />

dem leichter genießbaren Thema der generischen Funktionen zu, die <strong>in</strong> C ++<br />

auch als Function Templates bezeichnet werden. Ziehen wir zu Erklärungszwecken<br />

e<strong>in</strong> ganz e<strong>in</strong>faches Beispiel heran: Wir wollen e<strong>in</strong>e Funktion implementieren,<br />

die als Parameter e<strong>in</strong> beliebiges Array nimmt und als return-Value<br />

den Index des wertmäßig größten Elements <strong>in</strong> diesem Array liefert. Sollte der<br />

Maximalwert nicht e<strong>in</strong>deutig bestimmbar se<strong>in</strong>, weil mehrere Elemente gleich<br />

groß s<strong>in</strong>d, so wird der Index des ersten der möglichen Elemente geliefert.<br />

Das Template zu dieser Funktion, das der generischen Implementation<br />

entspricht, f<strong>in</strong>det sich <strong>in</strong> f<strong>in</strong>d_max_template_function.h und sieht so aus:<br />

1 // f<strong>in</strong>d max template function . h − implementation o f a template<br />

2 // function that f i n d s the g r e a t e s t element <strong>in</strong> an a r b i t r a r y array<br />

3<br />

4 #ifndef f i n d m a x t e m p l a t e f u n c t i o n h<br />

5 #def<strong>in</strong>e f i n d m a x t e m p l a t e f u n c t i o n h<br />

6<br />

7 #<strong>in</strong>clude ” u s e r t y p e s . h”<br />

8<br />

9 template u<strong>in</strong>t32 f<strong>in</strong>dMax (<br />

10 const ElementType ∗ elements , u<strong>in</strong>t32 num elements )<br />

11 {<br />

12 u<strong>in</strong>t32 current max = 0;<br />

13<br />

14 for ( u<strong>in</strong>t32 <strong>in</strong>dex = 0 ; <strong>in</strong>dex < num elements ; <strong>in</strong>dex++)<br />

15 {<br />

16 i f ( elements [ <strong>in</strong>dex ] > elements [ current max ] )<br />

17 current max = <strong>in</strong>dex ;<br />

18 }<br />

19 return ( current max ) ;<br />

20 }<br />

21<br />

22 #endif // f i n d m a x t e m p l a t e f u n c t i o n h<br />

Um zu verstehen, was hier passiert, werfen wir e<strong>in</strong>mal e<strong>in</strong>en Blick auf Zeile 9,<br />

denn dort ist der Kern dessen versteckt, was Templates <strong>in</strong> C ++ ausmacht: Die<br />

Deklaration des generischen Typs. Die Deklaration<br />

template <br />

bedeutet <strong>in</strong> diesem Kontext Folgendes: ElementType ist <strong>in</strong> diesem Kontext<br />

e<strong>in</strong> generischer Typ, der bei Verwendung durch e<strong>in</strong>en konkreten Typ ersetzt<br />

werden muss. Wo auch immer also im Rahmen der Deklaration und Def<strong>in</strong>ition<br />

der Funktion ElementType als Typ verwendet wird, steht dieser also als<br />

Platzhalter für den konkreten Typ. Das Keyword template und die spitzen<br />

Klammern, die den bzw. die generischen Typen e<strong>in</strong>fassen, s<strong>in</strong>d <strong>in</strong> der C ++<br />

Syntax so def<strong>in</strong>iert.<br />

Betrachten wir den Rest der Deklaration der Funktion <strong>in</strong> den Zeilen 9–<br />

10, dann sehen wir, dass ElementType gleich e<strong>in</strong>mal als generischer Typ <strong>in</strong><br />

der Parameterliste der Funktion verwendet wird. Dadurch ist die genaue

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!