Προς το περιεχόμενο

Πότε προτιμάμεTemplates?


sonyxp

Προτεινόμενες αναρτήσεις

Οκ! δυνατό "εργαλείο" τα templates αλλά δεν πρέπει να το παρακάνει κανείς, δεν μπορεί δηλαδή το Project του να είναι όλο templates γιατί βαριέται ξέρω γω να κάνει συναρτήσεις για int, float, double...

 

Το θέμα είναι: Πότε τα προτιμάμε ? γιατί αν το παρακάνουμε απλά επιβραδύνουμε τον κώδικά μας...

 

Παράγειγμα 1: Θέλω να φτιάξω 3 συναρτήσεις που και οι 3 επιστρέφουν την μέγιστη τιμή, να προτιμήσω 3 συναρτήσεις με διαφορετικά ορίσματα και τύπο επιστροφής (int, float, double) ή να κάνω 1 συνάρτηση όπου μέσω των Template μας απαλλάσσει από "περιττό" κώδικα.

#include <......>

using namespace std;


// 1st way
int getMax(int a, int  {
 .......
}
float getMax(int a, int  {
........
}
double getMax(int a, int  {
........
}

// 2nd way
template <class T>
T getMax(T a, T  {
........
}

void main()
{
     ............
}

Ποια η απάντηση;;;

 

 

 

 

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Τα προτιμαμε οταν θελουμε να κανουμε κατι generic ή οταν θελουμε να μεταπρογραμματισουμε κατι (δικια μου μεταφραση) ή οταν θελουμε να κανουμε και τα δυο.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Η ερώτησή σου είναι "περίεργη" και αντί να σηκώνει απλή απάντηση μάλλον η ίδια προκαλεί επόμενες ερωτήσεις, όπως:

  • "δε μπορεί όλο το project να είναι templates" -- γιατί;
  • "αν το παρακάνουμε επιβραδύνουμε τον κώδικά μας" -- είσαι σίγουρος; ναι, υπάρχουν (ασυνήθιστες η/και hardcore) περιπτώσεις που έχεις συνέπειες αλλά δεν πείθομαι ότι αυτές έχει στο μυαλό του κάποιος που κάνει αυτή την εισαγωγικού επιπέδου ερώτηση.

Αναφέρεις επίσης το σενάριο ότι κάποιος γράφει templates γιατί "βαριέται" -- όταν κανείς προγραμματίζει με γνώμονα τη βαρεμάρα του νομίζω πως τελικά δε θα είναι τα templates η αιτία των όποιων προβλημάτων προκύψουν.

 

Γενικά χρησιμοποιείς templates όταν θέλεις να κάνεις την ίδια επεξεργασία σε ένα "ανοιχτό" (με την έννοια ότι δεν ξέρεις την ώρα που γράφεις το template τα μέλη του) σύνολο τύπων ενώ overload όταν θέλεις να κάνεις διαφορετικά πράγματα με ένα "κλειστό" σύνολο τύπων. Αυτό φυσικά είναι πολύ γενικό και στην πραγματικότητα υπάρχουν πολλές λεπτομέρειες οι οποίες μπαίνουν στην απόφαση. Αλλά είναι ΟΚ νομίζω σαν περίληψη.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Τα templates έχουν διαφορετικό "σκοπό" απο ότι το overloading. Τα templates τα χρησιμοποιούμε όταν θέλουμε να κάνουμε το ίδιο στα arguments που έχουμε. Το overloading αν θέλουμε να κάνουμε κάτι διαφορετικό με βάση το argument.  Στο απλουστευμένο παράδειγμά σου το σωστότερο είναι το template.

Π.χ αν εκανες queries και το function name ήταν find θα έκανες διαφορετικό query με βάση τα parameters. Εκεί λοιπόν το σωστότερο θα ήταν to overloading.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Όταν θές να φτιάξεις συναρτήσεις χωρις να τους "λες" τι τύπο δεδομένων παίρνουν , το template μπορεις να το χρησιμοποιήσεις οσες φορές θέλεις. ;)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Όταν θές να φτιάξεις συναρτήσεις χωρις να τους "λες" τι τύπο δεδομένων παίρνουν , το template μπορεις να το χρησιμοποιήσεις οσες φορές θέλεις. ;)

 

Όλα καλά όταν μιλάμε για τους βασικούς τύπους, όταν όμως κάποιος περνάει αντικείμενα κλάσεων?

 

Δηλαδή να περάσω 2 αντικείμενα κλάσεων όπως παρακάτω...


class MyClass
{  };  // Empty Class

template <class T>
T add(T a, T  {
........
}

void Main()
{
      MyClass obj1, obj2;
      cout << add(obj1, obj2);
}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν εχει λογικη αυτο που γραφεις.

Το template, οπως λεει και το ονομα του, ειναι ενα template. Πχ ας παρουμε αυτο

template <class T>
T Add(const T& a, const T& 
{
	return a + b;
}

Ειναι συναρτηση το παραπανω; Οχι. Αν το βαλεις στο cpp σου, δεν θα γινει compile το παραπανω. (Για αυτο το λογο δεν γινεται να εχει template class σε h & cpp )

 

Εαν ομως, την καλεσεις καπου πχ ετσι

Add(1,2); 

τοτε θα γινει compile, αλλα οχι το παραπανω. Ο compiler, με βαση το παραπανω template, θα δημιουργησει μια νεα συναρτηση.

πχ η νεα συναρτηση

int AddDenEinaiStandarToOnoma(const int& a, const int& 
{
	return a + b;
}

Η οποια και θα γινει "compile".

 

Και ερχομαι στο αρχικο "δεν εχει λογικη αυτο που γραφεις". Αν βαλεις μια empty class (δηλαδη κατι το οποιο δεν εχει τον operator + ) τοτε η συναρτηση που θα βγει θα ειναι αυτη

MyEmptyClass Addsaddasd(const MyEmptyClass& a, const MyEmptyClass& 
{
	return a + b;
}

Θα γινει compile κατι τετοιο; Οχι. 

Ποιο θα ειναι το error σε εαν εφτιαχνες κατι τετοιο χωρις template;

error C2676: binary '+' : 'const MyEmptyClass' does not define this operator or a conversion to a type acceptable to the predefined operator

Ποιο ειναι το error με templae

error C2676: binary '+' : 'const MyEmptyClass' does not define this operator or a conversion to a type acceptable to the predefined operator
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Όπως λέει το παπί: όταν ο compiler δει μια χρήση ενός template προσπαθεί να κάνει compile ένα instantiation του template έχοντας αντικαταστήσει τους τύπους όπως προκύπτει από τον κώδικα. Αν αυτό έχει νόημα, τότε καλώς -- αν όχι, τότε error.

 

 

 

Για την ακρίβεια αν όχι τότε σε περίπτωση όπως αυτή που έχεις function template αν υπάρχει κι άλλη πιθανότητα κλήσης function λόγω overloading τότε θα δοκιμαστούν όλες πριν δώσει error, ακόμα κι αν κάποιες που έχουν ήδη δοκιμαστεί δεν κάνουν compile. Αυτό λέγεται SFINAE και είναι από τις πιο βασικές τεχνικές template programming.

 

 

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...