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 14:05] – [Templates Συναρτήσεων με παραμέτρους κλάσεις] 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() 
- +  int a = 5, b = 10
-#include<cstring> +  double d = 5.5f=3.3
- +  cout << "max(5,10): " << maximum(a,b<< endl
-class Student { +  cout << "max(5.5,3.3): << maximum(d,f) << endl;
-  char *name; +
-  int aem+
-   +
-public: +
-  Student(const char *nameint aem)+
-  Student(); +
-  ~Student(); +
-  char *getName() const; +
-  int getAEM() const; +
-  friend std::ostream& operator<<(std::ostream& outconst Student & st)+
-}; +
- +
-Student::Student(const char *nameint aem+
-  this->name = new char [strlen(name) + 1]+
-  strcpy(this->namename)+
-  this->aem = aem; +
-+
- +
-Student::Student() { +
-  this->name = nullptr; +
-  this->aem = 0; +
-+
- +
-Student::~Student() { +
-  if(name != nullptr) +
-    delete []name; +
-+
- +
-char* Student::getName() const { +
-  return name; +
-+
- +
-int Student::getAEM() const { +
-  return aem; +
-+
- +
-std::ostream& operator<<(std::ostream& outconst Student& st+
-  out << st.name << " " << st.aem; +
-  return out;+
 } }
 </code> </code>
 +Ο λόγος είναι ότι ο //compiler// μπορεί να εξάγει τον τύπο της συνάρτησης που τελικά θα κατασκευάσει από το είδος των παραμέτρων της συνάρτησης κατά την κλήση της.
 +</WRAP>
  
-O κώδικας που κάνει χρήση της παραπάνω κλάσης είναι ο εξής:+===== Templates συναρτήσεων με παραμέτρους σύνθετους τύπους (κλάσεις) =====
  
-<code cpp maximum2.cpp> +Ας υποθέσουμε ότι θέλουμε να κάνουμε χρήση της παραπάνω συνάρτηση **maximum** προκειμένου να βρούμε το μέγιστο μεταξύ δύο φοιτητών. Η κλάση //Student// του φοιτητή δίνεται στην προηγούμενη ενότητα:
-template <typename T> +
-T& maximum(T& a, T& b) { return (a>b?a:b); }+
  
 +Εφόσον προσθέσουμε την παραπάνω συνάρτηση υπεφόρτωσης του τελεστή %%>%% το πρόγραμμα εκτυπώνει τα εξής:
 +<code cpp find_max2.cpp>
 #include <iostream> #include <iostream>
 +#include "Student.hpp"
 using namespace std; using namespace std;
  
-#include "Student.hpp"+template <typename T> 
 +T& maximum(T& a, T& b) { return (a>b?a:b); }
  
 int main() { int main() {
-  Student george("George", 1234), kate("Kate", 12345);  + Student george("George", 1234), kate("Kate", 4321); 
-  cout << "max('George','Kate'): " << maximum(george, kate) << endl;+ 
 + cout << "max('George','Kate'): " << maximum(george, kate) << endl;
 } }
 </code> </code>
  
-Εάν προσπαθήσουμε να μεταγλωττίσουμε, το πρόγραμμα βγάζει αρκετά μηνύματα λάθους τα οποία συμπυκνώνονται στο ότι ο μεταγλωττιστής δεν ξέρει πως να διαχειριστή την ανισότητα μεταξύ δύο αντικειμένων τύπου //Student//. Για τον λόγο αυτό θα πρέπει να υπερφορτώσουμε τον τελεστή **>** για την κλάση Student ως εξής:+===== Templates συναρτήσεων με αριθμητικές παραμέτρους ===== 
 + 
 +Ας υποθέσουμε τώρα ότι θέλουμε να βρούμε το μέγιστο μεταξύ περισσότερων των δύο αριθμητικών τιμών οι οποίες έχουν αποθηκευτεί σε ένα πίνακα. Σε αυτή την περίπτωση η συνάρτηση **maximum** θα μπορούσε να γραφεί ως εξής:
  
 <code cpp> <code cpp>
-// σύγκριση δύο μαθητών με βάση το ΑΕΜ τους +template <typename T, int size> 
-bool Student::operator<(const Studentstconst +Tmaximum(T a[]) { 
-  if(aem st.aem+  T& max = a[0]; 
-    return true+  for(int i=1; i<size; i++
-  return false;+    if(a[i]>max) 
 +      max = a[i]
 +  return max;
 } }
 </code> </code>
  
-Εφόσον προσθέσουμε την παραπάνω συνάρτηση υπεφόρτωσης του τελεστή **>**το πρόγραμμα εκτυπώνει τα εξής: +Παρατηρήστε ότι η συνάρτηση λαμβάνει μία επιπλέον ακέραια τιμή ως παράμετρο που αντιπροσωπεύει το μέγεθος του πίνακα.
-<code> +
-max('George','Kate'): Kate 12345 +
-</code>+
  
-===== Templates συναρτήσεων με αριθμητικές παραμέτρους =====+Ο κώδικας χρήσης της παραπάνω συνάρτησης θα μπορούσε να είναι ο εξής
 +<code cpp find_max3.cpp> 
 +#include <iostream> 
 +using namespace std;
  
-Ας υποθέσουμε τώρα ότι θέλουμε να βρούμε το μέγιστο μεταξύ περισσότερων των δύο αριθμητικών τιμών οι οποίες έχουν αποθηκευτεί σε ένα πίνακαΣε αυτή την περίπτωση η συνάρτηση **maximum** θα μπορούσε να γραφεί ως εξής:+#include "Student.hpp"
  
-template <typename T, int size=3>+template <typename T, int size>
 T& maximum(T a[]) { T& maximum(T a[]) {
   T& max = a[0];   T& max = a[0];
Line 141: Line 116:
   return max;   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.1556805933.txt.gz · Last modified: 2019/05/02 13:05 (external edit)