User Tools

Site Tools


cpp:function_templates

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
cpp:function_templates [2019/05/02 13:51] gthanoscpp:function_templates [Unknown date] (current) – external edit (Unknown date) 127.0.0.1
Line 26: Line 26:
  
 Ας προσπαθήσουμε να χρησιμοποιήσουμε την παραπάνω συνάρτηση. Ας προσπαθήσουμε να χρησιμοποιήσουμε την παραπάνω συνάρτηση.
-<code cpp maximum1.cpp>+<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 42: Line 42:
  
 <WRAP tip 80% center round> <WRAP tip 80% center round>
-Μία //templated// συνάρτηση είναι μία συνάρτηση η οποία για να πάρει την "οριστική" μορφή της θα πρέπει να προσδιοριστεί και ο τύπος των παραμέτρων που θα λάβει κατά την κλήση της. Στο παραπάνω παράδειγμα, ο //compiler// έχει κατασκευάσει δύο συναρτήσεις α) τη συνάρτηση με ακέραια ορίσματα και β) τη συνάρτηση με ορίσματα κινητής υποδιαστολής.+Μία //templated// συνάρτηση είναι μία συνάρτηση η οποία για να πάρει την "οριστική" μορφή της θα πρέπει να προσδιοριστεί και ο τύπος των παραμέτρων που θα λάβει κατά την κλήση της. Στο παραπάνω παράδειγμα, ο //compiler// έχει κατασκευάσει δύο διαφορετικές συναρτήσεις από μία //templated// συνάρτηση: α) τη συνάρτηση με ακέραια ορίσματα και β) τη συνάρτηση με ορίσματα κινητής υποδιαστολής.
 </WRAP> </WRAP>
  
-===== Templates Συναρτήσεων με παραμέτρους κλάσεις =====+<WRAP tip 80% center round> 
 +Μπορείτε να παραλείψετε τον τύπο των παραμέτρων κατά την κλήση της συνάρτησης **maximum** ως εξής
 +<code cpp find_max1.cpp> 
 +template <typename T> 
 +T& maximum(T& a, T& b) { return (a>b?a:b); }
  
-Ας υποθέσουμε ότι θέλουμε να κάνουμε χρήση της παραπάνω συνάρτηση **maximum** προκειμένου να βρούμε το μέγιστο μεταξύ δύο φοιτητών. Η κλάση του φοιτητή δίνεται παρακάτω:+#include <iostream> 
 +using namespace std;
  
-<code cpp Student.hpp> +int main() 
-class Student { +  int a = 5, b = 10
-  char *name; +  double d = 5.5f=3.3
-  int aem+  cout << "max(5,10): " << maximum(a,b<< endl
-   +  cout << "max(5.5,3.3): " << maximum(d,f<< endl;
-public: +
-  Student(const char *nameint aem)+
-  Student()+
-  ~Student(); +
-  char *getName() const; +
-  int getAEM() const; +
-}; +
- +
-Student::Student(const char *nameint aem+
-  this->name = new char [strlen(name) + 1]; +
-  strcpy(this->name, name); +
-  this->aem = aem;+
 } }
 +</code>
 +Ο λόγος είναι ότι ο //compiler// μπορεί να εξάγει τον τύπο της συνάρτησης που τελικά θα κατασκευάσει από το είδος των παραμέτρων της συνάρτησης κατά την κλήση της.
 +</WRAP>
  
-Student::Student() { +===== Templates συναρτήσεων με παραμέτρους σύνθετους τύπους (κλάσεις) ===== 
-  this->name = nullptr+ 
-  this->aem = 0;+Ας υποθέσουμε ότι θέλουμε να κάνουμε χρήση της παραπάνω συνάρτηση **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>
  
-Student::~Student() { +===== Templates συναρτήσεων με αριθμητικές παραμέτρους ===== 
-  if(name !nullptr+ 
-    delete []name;+Ας υποθέσουμε τώρα ότι θέλουμε να βρούμε το μέγιστο μεταξύ περισσότερων των δύο αριθμητικών τιμών οι οποίες έχουν αποθηκευτεί σε ένα πίνακα. Σε αυτή την περίπτωση η συνάρτηση **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>
  
-char* Student::getName() const +Παρατηρήστε ότι η συνάρτηση λαμβάνει μία επιπλέον ακέραια τιμή ως παράμετρο που αντιπροσωπεύει το μέγεθος του πίνακα. 
-  return name;+ 
 +Ο κώδικας χρήσης της παραπάνω συνάρτησης θα μπορούσε να είναι ο εξής: 
 +<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 Student::getAEM() const +int main() { 
-  return aem;+  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> </code>
 +
  
cpp/function_templates.1556805119.txt.gz · Last modified: 2019/05/02 12:52 (external edit)