templates c with examples
Μάθετε τις διάφορες πτυχές των προτύπων στο C ++.
Τα πρότυπα είναι ένα από τα πιο ισχυρά χαρακτηριστικά του C ++. Τα πρότυπα μας παρέχουν τον κωδικό που είναι ανεξάρτητος από τον τύπο δεδομένων.
Με άλλα λόγια, χρησιμοποιώντας πρότυπα, μπορούμε να γράψουμε έναν γενικό κώδικα που λειτουργεί σε οποιονδήποτε τύπο δεδομένων. Πρέπει απλώς να περάσουμε τον τύπο δεδομένων ως παράμετρο. Αυτή η παράμετρος που περνά τον τύπο δεδομένων ονομάζεται επίσης όνομα τύπου.
Σε αυτό το σεμινάριο, θα διερευνήσουμε λεπτομερώς όλα τα πρότυπα και τις διάφορες πτυχές του.
=> Κάντε κλικ εδώ για την σειρά απόλυτης προπόνησης C ++.
Τι θα μάθετε:
- Τι είναι τα πρότυπα;
- Πώς να χρησιμοποιήσετε πρότυπα / υλοποίηση;
- τυπικό όνομα Vs. λέξη-κλειδί τάξης
- Πρότυπο και εξειδίκευση
- Ειδίκευση προτύπων
- Πρότυπα ποικιλίας C ++
- συμπέρασμα
- Συνιστώμενη ανάγνωση
Τι είναι τα πρότυπα;
Όπως αναφέρθηκε παραπάνω, τα πρότυπα είναι γενικά, δηλαδή ανεξάρτητα από τον τύπο δεδομένων. Τα πρότυπα χρησιμοποιούνται κυρίως για να διασφαλίσουν την επαναχρησιμοποίηση κώδικα και την ευελιξία των προγραμμάτων. Μπορούμε απλώς να δημιουργήσουμε μια απλή λειτουργία ή μια κλάση που λαμβάνει τον τύπο δεδομένων ως παράμετρο και να εφαρμόσουμε τον κώδικα που λειτουργεί για οποιονδήποτε τύπο δεδομένων.
Για παράδειγμα, Αν θέλουμε να λειτουργεί ένας αλγόριθμος ταξινόμησης για όλους τους αριθμητικούς τύπους δεδομένων, καθώς και τις συμβολοσειρές χαρακτήρων, τότε θα γράψουμε μια συνάρτηση που θα λαμβάνει τον τύπο δεδομένων ως επιχείρημα και θα εφαρμόσει την τεχνική ταξινόμησης.
Στη συνέχεια, ανάλογα με τον τύπο δεδομένων (όνομα ονόματος) που μεταβιβάζεται στον αλγόριθμο ταξινόμησης, μπορούμε να ταξινομήσουμε τα δεδομένα ανεξάρτητα από τον τύπο δεδομένων. Με αυτόν τον τρόπο δεν χρειάζεται να γράψουμε δέκα αλγόριθμους για δέκα τύπους δεδομένων.
Έτσι, τα πρότυπα μπορούν να χρησιμοποιηθούν σε εφαρμογές όπου απαιτείται ο κώδικας να μπορεί να χρησιμοποιηθεί για περισσότερους από έναν τύπους δεδομένων. Τα πρότυπα χρησιμοποιούνται επίσης σε εφαρμογές όπου η επαναχρησιμοποίηση κώδικα είναι πρωταρχικής σημασίας.
Πώς να χρησιμοποιήσετε πρότυπα / υλοποίηση;
Τα πρότυπα μπορούν να εφαρμοστούν με δύο τρόπους:
pl sql συνέντευξη ερώτηση και απαντήσεις για έμπειρους
- Ως πρότυπο λειτουργίας
- Ως πρότυπο τάξης
Πρότυπο λειτουργίας
Το Πρότυπο λειτουργίας είναι σαν μια κανονική λειτουργία, αλλά η μόνη διαφορά είναι ότι η κανονική λειτουργία μπορεί να λειτουργήσει μόνο σε έναν τύπο δεδομένων και ένας κωδικός προτύπου λειτουργίας μπορεί να λειτουργήσει σε πολλούς τύπους δεδομένων.
Ενώ μπορούμε πραγματικά να υπερφορτώσουμε μια κανονική λειτουργία για να εργαζόμαστε σε διάφορους τύπους δεδομένων, τα πρότυπα λειτουργιών είναι πάντα πιο χρήσιμα καθώς πρέπει να γράψουμε το μόνο πρόγραμμα και μπορεί να λειτουργήσει σε όλους τους τύπους δεδομένων.
Στη συνέχεια, θα δούμε την εφαρμογή προτύπων συνάρτησης.
Η γενική σύνταξη του προτύπου συνάρτησης είναι:
template T function_name(T args){ …… //function body }
Εδώ, το T είναι το όρισμα προτύπου που δέχεται διαφορετικούς τύπους δεδομένων και η κλάση είναι μια λέξη-κλειδί. Αντί για την κατηγορία λέξεων-κλειδιών, μπορούμε επίσης να γράψουμε «όνομα πληκτρολογίου».
Όταν ένας συγκεκριμένος τύπος δεδομένων μεταβιβάζεται στο function_name, ένα αντίγραφο αυτής της συνάρτησης δημιουργείται από τον μεταγλωττιστή με αυτόν τον τύπο δεδομένων ως όρισμα και εκτελείται συνάρτηση.
Ας δούμε ένα παράδειγμα για να κατανοήσουμε καλύτερα τα πρότυπα λειτουργίας.
#include using namespace std; template void func_swap(T &arg1, T &arg2) { T temp; temp = arg1; arg1 = arg2; arg2 = temp; } int main() { int num1 = 10, num2 = 20; double d1 = 100.53, d2 = 435.54; char ch1 = 'A', ch2 = 'Z'; cout << 'Original data
'; cout << 'num1 = ' << num1 << ' num2 = ' << num2< Στην κύρια συνάρτηση, ορίζουμε δεδομένα τύπου int, double και char. Καλούμε τη λειτουργία func_swap με κάθε τύπο δεδομένων. Στη συνέχεια, προβάλλουμε τα δεδομένα ανταλλαγής για κάθε τύπο δεδομένων.
Αυτό δείχνει ότι δεν χρειάζεται να γράψουμε τρεις συναρτήσεις για τρεις τύπους δεδομένων. Αρκεί να γράφετε μόνο μία συνάρτηση και την καθιστά μια λειτουργία προτύπου έτσι ώστε να είναι ανεξάρτητη από τον τύπο δεδομένων.
Πρότυπα τάξης
Όπως και στα πρότυπα λειτουργιών, ενδέχεται να έχουμε μια απαίτηση να έχουμε μια κλάση παρόμοια με όλες τις άλλες πτυχές, αλλά μόνο διαφορετικούς τύπους δεδομένων.
Σε αυτήν την περίπτωση, μπορούμε να έχουμε διαφορετικές κατηγορίες για διαφορετικούς τύπους δεδομένων ή διαφορετική εφαρμογή για διαφορετικούς τύπους δεδομένων στην ίδια τάξη. Αλλά αυτό θα κάνει τον κώδικα μας ογκώδη.
Η καλύτερη λύση για αυτό είναι να χρησιμοποιήσετε μια κλάση προτύπων. Η κλάση προτύπων συμπεριφέρεται επίσης παρόμοια με τα πρότυπα λειτουργιών. Πρέπει να μεταβιβάσουμε τον τύπο δεδομένων ως παράμετρο στην τάξη κατά τη δημιουργία αντικειμένων ή την κλήση λειτουργιών μέλους.
Η γενική σύνταξη για το πρότυπο κλάσης είναι:
template class className{ ….. public: T memVar; T memFunction(T args); };
Στον παραπάνω ορισμό, το T ενεργεί ως σύμβολο κράτησης θέσης για τον τύπο δεδομένων. Το memVar και το memFunction των δημόσιων μελών χρησιμοποιούν επίσης το T ως σύμβολο κράτησης θέσης για τύπους δεδομένων.
Μόλις οριστεί μια κλάση προτύπου όπως παραπάνω, μπορούμε να δημιουργήσουμε αντικείμενα κλάσης ως εξής:
className classObejct1; className classObject2; className classObject3;
Ας εφαρμόσουμε ένα παράδειγμα κώδικα για να δείξουμε Πρότυπα κλάσης:
#include using namespace std; template class myclass { T a, b; public: myclass (T first, T second) {a=first; b=second;} T getMaxval (); }; template T myclass::getMaxval () { return (a>b? a : b); } int main () { myclass myobject (100, 75); cout<<'Maximum of 100 and 75 = '< Παραγωγή:
Μέγιστο 100 και 75 = 100
Μέγιστο 'A' και 'a' = a
Το παραπάνω πρόγραμμα εφαρμόζει ένα παράδειγμα προτύπου κλάσης. Έχουμε την κλάση προτύπων myclass. Μέσα σε αυτό, έχουμε έναν κατασκευαστή που θα προετοιμάσει τα δύο μέλη α και β της τάξης. Υπάρχει μια άλλη συνάρτηση μέλους getMaxval που είναι επίσης ένα πρότυπο συνάρτησης που επιστρέφει το πολύ a και b.
Στην κύρια συνάρτηση, κατασκευάζουμε δύο αντικείμενα, το myobject of type integer και το mychobject του type type. Στη συνέχεια καλούμε τη συνάρτηση getMaxval σε κάθε ένα από αυτά τα αντικείμενα για να προσδιορίσουμε τη μέγιστη τιμή.
Σημειώστε ότι εκτός από τις παραμέτρους τύπου προτύπου (παράμετροι τύπου T), οι συναρτήσεις προτύπου μπορούν επίσης να έχουν συνηθισμένες παραμέτρους όπως κανονικές συναρτήσεις και επίσης προεπιλεγμένες τιμές παραμέτρων.
τυπικό όνομα Vs. λέξη-κλειδί τάξης
Κατά τη δήλωση κλάσης προτύπου ή συνάρτησης, χρησιμοποιούμε μία από τις δύο λέξεις-κλειδιά τάξη ή όνομα δακτυλίου. Αυτές οι δύο λέξεις είναι σημασιολογικά ισοδύναμες και μπορούν να χρησιμοποιηθούν εναλλακτικά.
πώς να ανοίξετε ένα αρχείο torrent windows 10
Αλλά σε ορισμένες περιπτώσεις, δεν μπορούμε να χρησιμοποιήσουμε αυτές τις λέξεις ως ισοδύναμες. Για παράδειγμα, όταν χρησιμοποιούμε εξαρτώμενους τύπους δεδομένων σε πρότυπα όπως το 'typedef', χρησιμοποιούμε όνομα πληκτρολογίου αντί για κλάση.
Επίσης, η λέξη-κλειδί κλάσης πρέπει να χρησιμοποιείται όταν πρέπει να δημιουργούμε ρητά ένα πρότυπο.
Πρότυπο και εξειδίκευση
Τα πρότυπα γράφονται με γενικό τρόπο, πράγμα που σημαίνει ότι πρόκειται για γενική εφαρμογή ανεξάρτητα από τον τύπο δεδομένων. Σύμφωνα με τον παρεχόμενο τύπο δεδομένων, πρέπει να δημιουργήσουμε μια συγκεκριμένη κατηγορία για κάθε τύπο δεδομένων.
Για παράδειγμα, εάν έχουμε έναν αλγόριθμο ταξινόμησης προτύπων, ενδέχεται να δημιουργήσουμε μια συγκεκριμένη κλάση για ταξινόμηση, μια άλλη κατηγορία για ταξινόμηση κ.λπ. Αυτό ονομάζεται instantiation του προτύπου.
Αντικαθιστούμε τα ορίσματα προτύπων (πραγματικοί τύποι δεδομένων) για τις παραμέτρους προτύπου στον ορισμό της κλάσης προτύπου.
Για παράδειγμα,
template class sort {};
Όταν περνάμε τον τύπο δεδομένων, ο μεταγλωττιστής αντικαθιστά τον τύπο δεδομένων με «Τ», έτσι ώστε ο αλγόριθμος ταξινόμησης γίνεται ταξινόμηση.
Κάθε φορά που χρησιμοποιούμε κλάση προτύπου ή συνάρτηση, υπάρχει ανάγκη για μια παρουσία όταν περνάμε έναν συγκεκριμένο τύπο δεδομένων. Εάν αυτή η παρουσία δεν υπάρχει ήδη, ο μεταγλωττιστής δημιουργεί ένα με τον συγκεκριμένο τύπο δεδομένων. Αυτό είναι το σιωπηρό παράδειγμα.
Ένα μειονέκτημα της σιωπηρής παρουσίας είναι ότι ο μεταγλωττιστής δημιουργεί κλάση παρουσίας μόνο για τα ορίσματα που χρησιμοποιούνται αυτήν τη στιγμή. Αυτό σημαίνει ότι εάν θέλουμε να δημιουργήσουμε μια βιβλιοθήκη παρουσιών πριν από τη χρήση αυτών των παρουσιών, πρέπει να προχωρήσουμε για ρητή παρουσία.
Ένα παράδειγμα δήλωσης προτύπου δίνεται παρακάτω:
template class Array(T)
Μπορεί να δημιουργηθεί ρητά ως:
template class Array
Όταν ένα μάθημα είναι instantiated, όλα τα μέλη του είναι επίσης instantiated.
Ειδίκευση προτύπων
Κατά τον προγραμματισμό με χρήση προτύπων, ενδέχεται να αντιμετωπίζουμε μια κατάσταση που να απαιτεί ειδική εφαρμογή για έναν συγκεκριμένο τύπο δεδομένων. Όταν συμβαίνει μια τέτοια κατάσταση, πηγαίνουμε για εξειδίκευση προτύπων.
Στην εξειδίκευση προτύπων, εφαρμόζουμε μια ειδική συμπεριφορά για έναν συγκεκριμένο τύπο δεδομένων εκτός από τον αρχικό ορισμό προτύπου για τους άλλους τύπους δεδομένων.
Για παράδειγμα, θεωρήστε ότι έχουμε μια τάξη προτύπων ' myIncrement » που έχει έναν κατασκευαστή για να αρχικοποιήσει μια τιμή και μια συνάρτηση προτύπου στοIncrement που αυξάνει την τιμή κατά 1.
Αυτή η συγκεκριμένη τάξη θα λειτουργήσει τέλεια για όλους τους τύπους δεδομένων εκτός από το char. Αντί να αυξάνεται η τιμή για το char, γιατί να μην του δώσετε μια ειδική συμπεριφορά και να μετατρέψετε τον χαρακτήρα σε κεφαλαία;
Για να γίνει αυτό, μπορούμε να πάμε για εξειδίκευση προτύπου για τον τύπο δεδομένων char.
Αυτή η εφαρμογή φαίνεται στο παρακάτω παράδειγμα κώδικα.
#include using namespace std; // class template: template class myIncrement { T value; public: myIncrement (T arg) {value=arg;} T toIncrement () {return ++value;} }; // class template specialization: template class myIncrement { char value; public: myIncrement (char arg) {value=arg;} char uppercase () { if ((value>='a')&&(value<='z')) value+='A'-'a'; return value; } }; int main () { myIncrement myint (7); myIncrement mychar ('s'); myIncrement mydouble(11.0); cout<<'Incremented int value: '<< myint.toIncrement()<< endl; cout<<'Uppercase value: '< Παραγωγή:
Αυξημένη τιμή int: 8
Κεφαλαία τιμή: S
Αυξημένη διπλή τιμή: 12

Στο παραπάνω πρόγραμμα που δείχνει εξειδίκευση προτύπου, δείτε τον τρόπο με τον οποίο δηλώσαμε ένα εξειδικευμένο πρότυπο για τον τύπο char. Πρώτα δηλώνουμε την αρχική τάξη και μετά την «ειδικεύουμε» για τον τύπο char. Για να ξεκινήσουμε την εξειδίκευση χρησιμοποιούμε την κενή δήλωση προτύπου 'template'.
Στη συνέχεια, μετά το όνομα της τάξης, συμπεριλαμβάνουμε τον τύπο δεδομένων. Μετά από αυτές τις δύο αλλαγές, η τάξη γράφεται για τον τύπο char.
Στην κύρια συνάρτηση, σημειώστε ότι δεν υπάρχει διαφορά μεταξύ της παρουσίασης του τύπου char και άλλων τύπων. Η μόνη διαφορά είναι ότι επαναπροσδιορίζουμε την εξειδικευμένη τάξη.
Σημειώστε ότι πρέπει να ορίσουμε όλα τα μέλη της εξειδικευμένης κλάσης, παρόλο που είναι ακριβώς τα ίδια στην γενική / πρωτότυπη κλάση προτύπου. Αυτό συμβαίνει επειδή δεν διαθέτουμε δυνατότητα κληρονομιάς για μέλη από το γενικό πρότυπο έως το εξειδικευμένο πρότυπο.
Πρότυπα ποικιλίας C ++
Μέχρι στιγμής έχουμε δει πρότυπα λειτουργιών που λαμβάνουν έναν καθορισμένο αριθμό ορισμάτων. Υπάρχουν επίσης πρότυπα που λαμβάνουν μεταβλητό αριθμό ορισμάτων. Αυτά τα πρότυπα λειτουργιών ονομάζονται πρότυπα παραλλαγής. Τα πρότυπα Variadic είναι ένα από τα νεότερα χαρακτηριστικά του C ++ 11.
Τα πρότυπα Variadic λαμβάνουν ένα μεταβλητό αριθμό ορισμάτων που είναι ασφαλή τύπου και τα ορίσματα επιλύονται κατά τη στιγμή της μεταγλώττισης.
Ας πάρουμε ένα πλήρες παράδειγμα προγραμματισμού για να το κατανοήσουμε αυτό.
#include #include using namespace std; template T summation(T val) { return val; } template T summation(T first, Args... args) { return first + summation(args...); } int main() { long sum = summation(1, 2, 3, 8, 7); cout<<'Sum of long numbers = '< Το παραπάνω παράδειγμα δείχνει παραλλαγή συνάρτησης, «άθροισμα». Όπως φαίνεται παραπάνω, χρειαζόμαστε πρώτα μια συνάρτηση βάσης που υλοποιεί τη θήκη βάσης. Στη συνέχεια, εφαρμόζουμε τη συνάρτηση variadic στην κορυφή αυτής της συνάρτησης.
Στην αθροιστική συνάρτηση μεταβλητής, καλείται 'όνομα πληκτρολογίου ... args' πακέτο παραμέτρων προτύπου ενώ λέγεται 'Args ... args' πακέτο παραμέτρων συνάρτησης .
Αφού γράψουμε ένα πρότυπο λειτουργίας που εφαρμόζει τη βασική περίπτωση, γράφουμε μια παραλλαγή συνάρτησης που εφαρμόζει τη γενική περίπτωση. Η παραλλαγή συνάρτησης γράφεται παρόμοια με την αναδρομή όπως φαίνεται για το άθροισμα (υποστηρίζει…). Το πρώτο όρισμα διαχωρίζεται από το πακέτο παραμέτρων συνάρτησης στον τύπο Τ (πρώτο).
πώς να ανοίξετε ένα αρχείο bin στον υπολογιστή
Με κάθε κλήση σε άθροισμα, η λίστα παραμέτρων μειώνεται κατά ένα όρισμα και τελικά επιτυγχάνεται η βασική συνθήκη. Η έξοδος δείχνει το άθροισμα για μεγάλους ακέραιους και χαρακτήρες.
συμπέρασμα
Με αυτό, ολοκληρώνουμε αυτό το σεμινάριο για πρότυπα στο C ++. Τα πρότυπα μας βοηθούν να κάνουμε τα προγράμματά μας γενικά, δηλαδή ανεξάρτητα από τον τύπο.
Διαβάστε επίσης = >> Εκμάθηση προτύπων φιάλης
Τα γενικά προγράμματα βρίσκονται πάντα στην κορυφή των άλλων προγραμμάτων, καθώς δεν χρειάζεται να γράφουμε ξεχωριστά προγράμματα για κάθε τύπο δεδομένων. Έτσι, η ανάπτυξη προγραμμάτων γενικής ασφάλειας τύπου μπορεί να είναι ένα σημαντικό βήμα προς τον αποτελεσματικό προγραμματισμό.
=> Δείτε τα εκπαιδευτικά σεμινάρια In-Depth C ++ εδώ.
Συνιστώμενη ανάγνωση
- Εκπαιδευτικό πρόγραμμα Python Main Function με πρακτικά παραδείγματα
- Πώς λειτουργεί η δοκιμή βάσει δεδομένων (παραδείγματα QTP και σεληνίου)
- Multithreading σε C ++ με παραδείγματα
- Εκμάθηση Python DateTime με παραδείγματα
- Δείγμα προτύπου υπόθεσης δοκιμής με παραδείγματα δοκιμαστικής θήκης (Λήψη)
- Αποκοπή εντολής στο Unix με παραδείγματα
- Δείγμα προτύπου για αναφορά δοκιμής αποδοχής με παραδείγματα
- Unix Cat Command Syntax, Επιλογές με παραδείγματα