Η σελίδα μας αναβαθμίστηκε, γι' αυτό τον λόγο τα μέλη μας θα πρέπει να ζητήσουν νέο κωδικό πρόσβασης από την υπηρεσία "Αποστολή κωδικού πρόσβασης".
Εάν το email με τον νέο κωδικό δεν έρθει στο inbox κοιτάξτε και στο spam folder. Ο server είναι φρέσκος και δεν έχει το reputation που του αξίζει.

C++ templates tutorial

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
alex599
Δημοσιεύσεις: 66
Εγγραφή: 17 Δεκ 2008 01:11
Τοποθεσία: Πάτρα

C++ templates tutorial

Δημοσίευση από alex599 » 10 Αύγ 2010 16:29

Τα πρότυπα (templates) χρησιμοποιούνται στην περίπτωση που θέλουμε να δημιουργήσουμε μια συνάρτηση ή μια κλάση η οποία θα χρησιμοποιηθεί για πολλού τύπους δεδομένων. Στην ουσία δηλαδή πρόκειται για μια μορφή συνοπτικής υπερφόρτωσης.

Ας τα πάρουμε με την σειρά:

Μια πρότυπη συνάρτηση (template function) ορίζεται με τον εξής απλό τρόπο:

Κώδικας: Επιλογή όλων

template<&#40;class|typename&#41; T,...>
type function_name&#40;parameters&#41;&#123;
     function_body;
&#125;
Δηλαδή για παράδειγμα, έστω ότι θέλουμε να φτιάξουμε μια συνάρτηση εύρεσης μεγίστου ανάμεσα σε 2 στοιχεία, αλλά δεν γνωρίζουμε τον τύπο δεδομένων των δύο στοιχείων. Τότε θα έχουμε:

Κώδικας: Επιλογή όλων

template<class T>
T max&#40;T a,T b&#41;&#123;
    return &#40;a>b&#41; ? a &#58; b;
&#125; 
H κλήση της παραπάνω συνάρτησης μπορεί να γίνει ως εξής: max(5,3) ή max(5.3,2.1) ή με μεταβλητές οποιοδήποτε βασικού τύπου (ο compiler καταλαβαίνει αυτόματα ποιος είναι ο τύπος Τ). Στην περίπτωση που ο τύπος Τ είναι μια προσαρμοσμένη κλάση χρήστη, θα πρέπει να έχει υπεφορτωθεί ο τελεστή >.

Αντίστοιχα, μπορούμε να δημιουργήσουμε και μια πρότυπη κλάση ως εξής:

Κώδικας: Επιλογή όλων

template<&#40;class|typename&#41; T,...>
class class_name&#123;
    data_fields;
    functions;
&#125;;
Όταν μια μέθοδος μιας πρότυπης κλάσης ορίζεται έξω από την περιοχή εμβέλειας της κλάσης, τότε θα πρέπει να οριστεί ως πρότυπη συνάρτηση, ενώ όταν ορίζεται στην περιοχή εμβέλειας της δεν υπάρχει τέτοια ανάγκη.

Για παράδειγμα μπορούμε να φτιάξουμε μια πρότυπη κλάση με όνομα array, η οποία δημιουργεί έναν πίνακα τύπου Τ:

Κώδικας: Επιλογή όλων

template<class T>
class array&#123;
    T *table;
    int size;
public&#58;
    array&#40;int n&#41;&#123;
       table=new T&#91;n&#93;;
       size=n;
    &#125;
    void insert&#40;&#41;;
    T max&#40;&#41;;
&#125;;

template<class T>
void array<T>&#58;&#58;insert&#40;&#41;&#123;
   for &#40;int i=0; i<size; i++&#41;&#123; 
       cin >> table&#91;i&#93;;
   &#125;
&#125;

template<class T>
T array<T>&#58;&#58;max&#40;&#41;&#123;
   T m=table&#91;0&#93;;
   for &#40;int i=1;i<size;i++&#41;&#123;
       if &#40;table&#91;i&#93;>m&#41; m=table&#91;i&#93;;
   &#125;
   return m;
&#125; 
Η κλάση array περιέχει τρεις μεθόδους, έναν δημιουργό για την δημιουργία του πίνακα, μια μέθοδο εισαγωγής των στοιχείων στον πίνακα και μια μέθοδο εύρεσης του μέγιστου στοιχείου.

Έτσι, ένα πρόγραμμα χρήσης της παραπάνω κλάσης είναι το εξής:

Κώδικας: Επιλογή όλων

#include <iostream>

using namespace std;

int main&#40;&#41;&#123;
   array<int> A&#40;5&#41;;
   A.insert&#40;&#41;;
   cout << "Μέγιστο στοιχείο του πίνακα&#58; " << A.max&#40;&#41; << endl;
   return 0;
&#125;
Στο πρόγραμμα αυτό βλέπουμε το πως γίνεται η δημιουργία ενός αντικειμένου της πρότυπης κλάσης με χρήση των <> όπου προσδιορίζεται ο τύπος Τ.

Ακόμη, μπορούμε να έχουμε και πιο προχωρημένα πράγματα όπως είναι η χρήση σταθερών παραμέτρων κατά τον ορισμό των τύπων Τ της πρότυπης κλάσης. Δηλαδή, ας υποθέσουμε τον κώδικα:

Κώδικας: Επιλογή όλων

template<class T,int size>
class array&#123;
    T *table;
public&#58;
    array&#40;&#41;&#123;
         table=new T&#91;size&#93;;
    &#125;;
    void insert&#40;&#41;;
    T max&#40;&#41;;
&#125;;
...
Σε αυτή τη περίπτωση, η δημιουργία ενός αντικειμένου της κλάσης array μπορεί να γίνει ως εξής: array<int,5> A;

Τέλος, μπορούμε να φτιάξουμε και εξειδικευμένα "στιγμιότυπα" της πρότυπης κλάσης. Αυτό γίνεται στην περίπτωση που για κάποιον συγκεκριμένο τύπο θέλουμε να ορίσουμε διαφορετικά κάποια μέθοδο ή να προσθαφαιρεσουμε πράγματα κτλ.

Για παράδειγμα, θεωρούμε την κλάση:

Κώδικας: Επιλογή όλων

template<>
class array<bool>&#123;
    bool *table;
    int size;
public&#58;
    array&#40;&#41;;
    void insert&#40;&#41;;
    bool max&#40;&#41;;
&#125;;
...
bool array<bool>&#58;&#58;max&#40;&#41;&#123;  
   int sum_f=0,sum_t=0;
   for &#40;int i=0; i<size; i++&#41;&#123;
       if &#40;table&#91;i&#93;&#41; ++sum_t;
       else ++sum_f;
   &#125;
   return &#40;sum_t>sum_f&#41;;
&#125; 
Στον παραπάνω κώδικα, ορίζουμε μια διαφορετική εκδοχή της κλάσης array για τον τύπο bool όπου η αλλαγή είναι μόνο στην μέθοδο max() όπου επιστρέφουμε true αν οι "αλήθειες" είναι περισσότερες από τα "ψέμματα" στον πίνακα.

Παρατηρήστε πως ορίζεται μια τέτοια εξειδικευμένη κλάση (δεν υπάρχει ο τύπος Τ στα <>) ενώ δίπλα από το όνομα της κλάσης ορίζουμε ρητά τον τύπο για τον οποίο γίνεται η εξειδίκευση. Η δημιουργία αντικειμένου ή η κλήση μεθόδων γίνεται με τον κλασικό τρόπο.

Αυτά τα λίγα!
while(!dead()) ++knowledge;

papi1
Δημοσιεύσεις: 8
Εγγραφή: 01 Φεβ 2009 12:58

C++ templates tutorial

Δημοσίευση από papi1 » 11 Αύγ 2010 02:46

templates Πολυ δυνατο χαρτι της c++! Ωραιος οδηγος :D .

Btw Ενα τρικ/τιπ. Μια function "ειναι type", αρα μπορει να περασει ως template :o , με αποτελεσμα να κανεις παπαδες.
Πχ μια function τυπου where (σαν αυτη της SQL)

Κώδικας: Επιλογή όλων

template<class _In,class _Pred>
__inline void print_where&#40;_In first,_In last,_Pred func&#41;
&#123;
		for&#40;;first != last; ++first&#41;
		   if&#40;func&#40;*first&#41;&#41;
			   cout<<*first<<endl;
&#125;
__inline bool pred&#40;int& i&#41;
&#123;
	if&#40;i%2==0&#41;
		return true;
	return false;
&#125;
__inline bool pred1&#40;string& s&#41;
&#123;
	if&#40;s.size&#40;&#41;==4&#41;
		return true;
	return false;
&#125;
int main&#40;&#41;
&#123;
	int arr&#91;&#93; =&#123;1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17&#125;;
	string names&#91;&#93; = &#123;"Poppy","Aljandro","Boby","Jack","Ale Bale Ahmet"&#125;;
	
	print_where&#40;arr,arr+17,pred&#41;;

	print_where&#40;names,names+5,pred1&#41;;
	
	
	cin.get&#40;&#41;;
	return 0;
&#125;
Happy coding

alex599
Δημοσιεύσεις: 66
Εγγραφή: 17 Δεκ 2008 01:11
Τοποθεσία: Πάτρα

C++ templates tutorial

Δημοσίευση από alex599 » 11 Αύγ 2010 10:23

@papi1: Ωραίο κολπάκι αυτό με τις συναρτήσεις!
while(!dead()) ++knowledge;

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες