User Tools

Site Tools


cpp:function_templates

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
cpp:function_templates [2019/05/02 13:43]
gthanos created
cpp:function_templates [2021/06/04 17:29]
gthanos
Line 26: Line 26:
  
 Ας προσπαθήσουμε να χρησιμοποιήσουμε την παραπάνω συνάρτηση. Ας προσπαθήσουμε να χρησιμοποιήσουμε την παραπάνω συνάρτηση.
-<code cpp maximum1.cpp>+<code cpp find_max1.cpp> 
 +template <typename T> 
 +T& maximum(T& a, T& b) { return (a>b?a:b);
 + 
 +#include <iostream> 
 +using namespace std; 
 + 
 +int main() { 
 +  int a = 5, b = 10; 
 +  double d = 5.5, f=3.3; 
 +  cout << "max(5,10): " << maximum<int>(a,b) << endl; 
 +  cout << "max(5.5,3.3): " << maximum<double>(d,f) << endl; 
 +
 +</code> 
 + 
 +<WRAP tip 80% center round> 
 +Μία //templated// συνάρτηση είναι μία συνάρτηση η οποία για να πάρει την "οριστική" μορφή της θα πρέπει να προσδιοριστεί και ο τύπος των παραμέτρων που θα λάβει κατά την κλήση της. Στο παραπάνω παράδειγμα, ο //compiler// έχει κατασκευάσει δύο διαφορετικές συναρτήσεις από μία //templated// συνάρτηση: α) τη συνάρτηση με ακέραια ορίσματα και β) τη συνάρτηση με ορίσματα κινητής υποδιαστολής. 
 +</WRAP> 
 + 
 +<WRAP tip 80% center round> 
 +Μπορείτε να παραλείψετε τον τύπο των παραμέτρων κατά την κλήση της συνάρτησης **maximum** ως εξής: 
 +<code cpp find_max1.cpp>
 template <typename T> template <typename T>
 T& maximum(T& a, T& b) { return (a>b?a:b); } T& maximum(T& a, T& b) { return (a>b?a:b); }
Line 40: Line 61:
 } }
 </code> </code>
 +Ο λόγος είναι ότι ο //compiler// μπορεί να εξάγει τον τύπο της συνάρτησης που τελικά θα κατασκευάσει από το είδος των παραμέτρων της συνάρτησης κατά την κλήση της.
 +</WRAP>
 +
 +===== Templates συναρτήσεων με παραμέτρους σύνθετους τύπους (κλάσεις) =====
 +
 +Ας υποθέσουμε ότι θέλουμε να κάνουμε χρήση της παραπάνω συνάρτηση **maximum** προκειμένου να βρούμε το μέγιστο μεταξύ δύο φοιτητών. Η κλάση //Student// του φοιτητή δίνεται στην προηγούμενη ενότητα:
 +
 +Εφόσον προσθέσουμε την παραπάνω συνάρτηση υπεφόρτωσης του τελεστή %%>%% το πρόγραμμα εκτυπώνει τα εξής:
 +<code cpp find_max2.cpp>
 +#include <iostream>
 +#include "Student.hpp"
 +using namespace std;
 +
 +template <typename T>
 +T& maximum(T& a, T& b) { return (a>b?a:b); }
 +
 +int main() {
 + Student george("George", 1234), kate("Kate", 4321);
 +
 + cout << "max('George','Kate'): " << maximum(george, kate) << endl;
 +}
 +</code>
 +
 +===== Templates συναρτήσεων με αριθμητικές παραμέτρους =====
 +
 +Ας υποθέσουμε τώρα ότι θέλουμε να βρούμε το μέγιστο μεταξύ περισσότερων των δύο αριθμητικών τιμών οι οποίες έχουν αποθηκευτεί σε ένα πίνακα. Σε αυτή την περίπτωση η συνάρτηση **maximum** θα μπορούσε να γραφεί ως εξής:
 +
 +<code cpp>
 +template <typename T, int size>
 +T& maximum(T a[]) {
 +  T& max = a[0];
 +  for(int i=1; i<size; i++)
 +    if(a[i]>max)
 +      max = a[i];
 +  return max;
 +}
 +</code>
 +
 +Παρατηρήστε ότι η συνάρτηση λαμβάνει μία επιπλέον ακέραια τιμή ως παράμετρο που αντιπροσωπεύει το μέγεθος του πίνακα.
 +
 +Ο κώδικας χρήσης της παραπάνω συνάρτησης θα μπορούσε να είναι ο εξής:
 +<code cpp find_max3.cpp>
 +#include <iostream>
 +using namespace std;
 +
 +#include "Student.hpp"
 +
 +template <typename T, int size>
 +T& maximum(T a[]) {
 +  T& max = a[0];
 +  for(int i=1; i<size; i++)
 +    if(a[i]>max)
 +      max = a[i];
 +  return max;
 +}
 +
 +int main() {
 +  Student george("George", 1234), kate("Kate", 12345), mary("Mary", 12346);
 +  Student students[] = { george, kate, mary };
 +  cout << "max('George','Kate', 'Mary'): " << maximum<Student,3>(students) << endl;
 +}
 +</code>
 +
 +
cpp/function_templates.txt · Last modified: 2021/06/04 16:29 (external edit)