Thuis
Contacten

    Hoofdpagina


Programmeren in C++ voor beginners

Dovnload 5.04 Mb.

Programmeren in C++ voor beginners



Pagina37/49
Datum25.10.2017
Grootte5.04 Mb.

Dovnload 5.04 Mb.
1   ...   33   34   35   36   37   38   39   40   ...   49

Een mogelijk eindprogramma van vandaag.
Onze grafische applicaties geven een knipperend onrustig beeld, omdat deze single-buffered zijn. Vandaag leren we double-buffering, wat een rustig niet-knipperend beeld oplevert. Ook leren we onze eigen template functies te schrijven, enkele STL functies en zien we hoe willekeurig 'willekeurige' getallen zijn. Ook maken we ons eigen simpele data type.

    1. Template functies

Template functies zijn hetzelfde als normale functies, behalve dat het data type niet gespecificeerd wordt. Dit maakt een functie veel algemener.


Hieronder twee functies die twee 'ietsen' optellen. De eerste is specifiek voor int, de tweede is algemeen. De verschillen heb ik in rood aangegeven.
int TelOp(const int a, const int b)

{

return a + b;

}
template <class T>

T TelOp(const T& a, const T& b)

{

return a + b;

}
Merk het volgende op:

* Voor een template functie moet aangegeven hoe het template data type heet. Standaard wordt bij simpele functies de letter T hiervoor gebruikt.

* De functieargumenten worden met behulp van referencing door gegeven. Dit omdat onbekend is welk data type daadwerkelijk gebruikt gaat worden.






Geef de voorkeur een reference-to-const aan een functie te geven, behalve bij ingebouwde types, zoals int.






Het is mogelijk de functie te optimalizeren over het type dat 'ie als argument krijgt. Zie mijn boek 'Modern C++ Design'.

De template versie van TelOp kun je op dezelfde manier aanroepen als een normale functie.


Hieronder twee functies die de elementen van een std::vector optellen. De eerste is specifiek voor std::vector<double>, de tweede is algemeen. De verschillen heb ik in rood aangegeven.
double TelOp(const std::vector<double>& v)

{

const int size = v.size();



double sum = 0.0;

for (int i=0; i!=size; ++i)

{

sum+=v[i];



}

return sum;

}

template <class T>

T TelOp(const std::vector& v)

{

const int size = v.size();

T sum = 0.0;

for (int i=0; i!=size; ++i)

{

sum+=v[i];



}

return sum;

}
Merk het volgende op:

* Deze TelOp functie en de vorige Telop functie kunnen in hetzelfde programma staan. De compiler kan ze aan de hand van hun argumenten uit elkaar houden.

* De variabele 'size' blijft van het type int. De grootte van een std::vector is altijd een (unsigned) int.


De template versie van TelOp kun je op dezelfde manier aanroepen als een normale functie.




Dit is nog maar een eerste voorbeeld van wat je met templates kunt. Met templates alleen kun je al alle denkbare berekeningen uitvoeren! Dit wordt 'Template Metaprogramming' genoemd.
1   ...   33   34   35   36   37   38   39   40   ...   49


Dovnload 5.04 Mb.