Λοιπόν έχω
το οποίο λειτουργεί για όλους τους τύπους.Κώδικας:template <class TYPE> void test(TYPE x) { //σώμα1 }
Θέλω να κάνω κάτι έτσι ώστε όταν ο τύπος έχει "unsigned" να εκτελείται κάτι άλλο
δηλαδή κάτι τέτοιο
Κώδικας:template <class TYPE> void test(unsigned TYPE x) { //σώμα2 }Κώδικας:unsigned int x=0; int y=0; short int z=0; unsigned short int k=0; test(x); //εκτελείται το σώμα2 test(y); //εκτελείται το σώμα1 test(z); //εκτελείται το σώμα1 test(k); //εκτελείται το σώμα2
πώς το κάνω αυτό;
Εμφάνιση 1-10 από 10
Θέμα: templates c++
-
22-07-12, 14:54 templates c++ #1
-
22-07-12, 23:33 Απάντηση: templates c++ #2
Δοκίμασες την enable_if ? Αν ο compiler σου υποστηρίζει C++11 τότε είναι std:: αλλιώς είναι boost::
Κώδικας:#include <iostream> #include <type_traits> template <class TYPE> void test(TYPE x, typename std::enable_if<!std::is_unsigned<TYPE>::value >::type *dummy = 0) { std::cout << "signed" << std::endl; } template <class TYPE> void test(TYPE x, typename std::enable_if<std::is_unsigned<TYPE>::value >::type *dummy = 0) { std::cout << "unsigned" << std::endl; } int main(void) { unsigned int ui = 0; int i = 0; short int si = 0; unsigned short int usi = 0; test(ui); test(i); test(si); test(usi); return 0; }
Κώδικας:% g++ -Wall -std=c++11 mitsos.cc % ./a.out unsigned signed signed unsigned
"I like offending people, because I think people who get offended should be offended" - Linus Torvalds
"Παλιά είχαμε φτωχούς οι οποίοι ζούσανε σε φτωχογειτονιές. Τώρα, η οικονομικά δυσπραγούσα τάξη
κατέχει στέγες υποδεέστερης ποιότητας σε υποβαθμισμένα αστικά κέντρα" - George Carlin
Γα.... την πολιτική ορθότητα.
-
23-07-12, 12:41 Απάντηση: templates c++ #3
Ευχαριστώ, έχει πολύ φασαρία
-
23-07-12, 17:14 Απάντηση: templates c++ #4
Πέρα από αυτό που λέει ο imitheos (που δεν το έχω χρησιμοποιήσει), υπάρχουν δύο τρόποι να το κάνεις. Ο πρώτος είναι με template specialization και ο δεύτερος απλά γράφοντας μία non-template function. Με τον πρώτο τρόπο έχεις:
Κώδικας:template <class TYPE> void test(TYPE x) { //σώμα1 } template<> void test<unsigned>(unsigned x) { //σώμα2 }
Κώδικας:template <class TYPE> void test(TYPE x) { //σώμα1 } void test(unsigned x) { //σώμα2 }
Εγώ θα προτιμούσα τον πρώτο τρόπο επειδή δείχνει ακριβώς αυτό που θέλεις να κάνεις (να εξειδικεύσεις το template σε σχέση με τον τύπο unsigned).
-
23-07-12, 17:46 Απάντηση: templates c++ #5
MichaelSE, έαν δεν κάνω λάθος με αυτόν τον τρόπο εάν η παράμετρος είναι unsigned long int, unsigned short int, unsigned long long int, θα εκτελεστεί το σώμα1. Εγώ θέλω για όλα τα "unsigned [κατι]" να εκτελείτε το σώμα2 όχι μόνο για unsigned int, χωρίς να γράψω για το κάθε ένα ξεχωριστά
-
23-07-12, 17:48 Απάντηση: templates c++ #6
Μάλλον θα ρωτήσω χαζομάρες αλλά ο 2ος τρόπος που δεν χρησιμοποιεί template είναι δηλαδή μια απλή overloaded function ?
Ακόμη, και στους δύο τρόπους η 2η συνάρτηση παίζει για όλους τους τύπους ? Έτσι που την διαβάζω μου δίνει την εντύπωση ότι θα παίζει μόνο για unsigned int αλλά δεν γνωρίζω πως πάνε αυτά στη c++."I like offending people, because I think people who get offended should be offended" - Linus Torvalds
"Παλιά είχαμε φτωχούς οι οποίοι ζούσανε σε φτωχογειτονιές. Τώρα, η οικονομικά δυσπραγούσα τάξη
κατέχει στέγες υποδεέστερης ποιότητας σε υποβαθμισμένα αστικά κέντρα" - George Carlin
Γα.... την πολιτική ορθότητα.
-
23-07-12, 17:53 Απάντηση: templates c++ #7
Το ίδιο λέμε imitheos
-
23-07-12, 20:42 Απάντηση: templates c++ #8
Το ίδιο με τον ιμίθεο θα σου γράψω απλά αντί να έχω το enable_if μέσα στην func σαν δεύτερη παράμετρο με default τιμή θα το βάλω έξω απο την συνάρτηση:
Κώδικας:#include <iostream> #include <type_traits> template <class TYPE> typename std::enable_if<!std::is_unsigned<TYPE>::value>::type test(TYPE x) { std::cout << "signed" << std::endl; } template <class TYPE> typename std::enable_if<std::is_unsigned<TYPE>::value >::type test(TYPE x) { std::cout << "unsigned" << std::endl; }
Τελευταία επεξεργασία από το μέλος xcyanx : 24-07-12 στις 04:47.
-
23-07-12, 22:50 Απάντηση: templates c++ #9
Έτσι είναι όπως τα λες. Συγγνώμη, δεν κατάλαβα αυτό που εννοούσες, γιατί στη C++ ο τύπος unsigned και ο unsigned int ταυτίζονται (όπως λες κι εσύ). Γι΄αυτό θεωρούσα ότι όταν λες unsigned εννοείς unsigned int.
Για να γίνει αυτό που λες χρειάζεται να κάνεις overload κάθε τύπο ξεχωριστά. Γιατί παρόλο που λεξικογραφικά οι τύποι unsigned int και unsigned long long int μοιάζουν, στην πραγματικότητα είναι διαφορετικοί.
Όχι, δεν είναι χαζομάρες αυτό που ρωτάς, αντίθετα μάλιστα, είναι και ο λόγος που έγραψα και παραπάνω ότι εγώ προτιμάω τον πρώτο τρόπο δήλωσης. Γιατί όντως ο δεύτερος τρόπος είναι μία απλή overloaded function και δεν σου δίνει καθόλου να καταλάβεις ότι είναι specialization του template. Γι' αυτόν το λόγο μπορεί να οδηγήσει σε παρανοήσεις στον κώδικα.
Για το δεύτερο που λες, έχεις δίκιο, είναι αυτό που απάντησα και στον void90. Ήταν δικό μου λάθος γιατί δεν κατάλαβα τι ρώτησε εξαρχής.
-
24-07-12, 11:21 Απάντηση: templates c++ #10
Ευχαριστώ για τις απαντήσεις, η λύση του xcyanx φαίνεται πιο ωραία, να'στε καλά
Παρόμοια Θέματα
-
πρόβλημα templates
Από psithike στο φόρουμ Web authoring, development & web designΜηνύματα: 3Τελευταίο Μήνυμα: 07-06-12, 01:27 -
Έτοιμα templates
Από Antonis94 στο φόρουμ Web authoring, development & web designΜηνύματα: 10Τελευταίο Μήνυμα: 17-06-09, 11:57 -
Δωρεάν Web Templates
Από drkameleon στο φόρουμ Internet, web surfing και online υπηρεσίεςΜηνύματα: 12Τελευταίο Μήνυμα: 04-05-09, 08:36 -
Πρόβλημα με Templates σε TG585v7
Από Spanos στο φόρουμ Alcatel Thomson ADSL modems και routersΜηνύματα: 13Τελευταίο Μήνυμα: 18-12-08, 20:24 -
free templates
Από Knorcedger στο φόρουμ Web authoring, development & web designΜηνύματα: 3Τελευταίο Μήνυμα: 27-08-06, 16:30
Bookmarks