Εμφάνιση 1-10 από 10

Θέμα: templates c++

  1. #1
    Εγγραφή
    15-11-2009
    Περιοχή
    Ιωάννινα
    Ηλικία
    33
    Μηνύματα
    95
    Downloads
    0
    Uploads
    0
    ISP
    Forthnet
    Λοιπόν έχω

    Κώδικας:
    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


    πώς το κάνω αυτό;

  2. #2
    Εγγραφή
    20-12-2005
    Μηνύματα
    3.228
    Downloads
    4
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    49997/4997
    ISP
    ΟΤΕ Conn-x
    DSLAM
    ΟΤΕ - ΞΑΝΘΗ
    Router
    Speedport W 724V
    SNR / Attn
    24,4(dB) / (dB)
    Δοκίμασες την 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
    Disclaimer: Είμαι τελείως σκράπας από c++ οπότε μπορεί να υπάρχει ένας πολύ πιο εύκολος τρόπος να γίνει η δουλειά.
    "I like offending people, because I think people who get offended should be offended" - Linus Torvalds

    "Παλιά είχαμε φτωχούς οι οποίοι ζούσανε σε φτωχογειτονιές. Τώρα, η οικονομικά δυσπραγούσα τάξη
    κατέχει στέγες υποδεέστερης ποιότητας σε υποβαθμισμένα αστικά κέντρα" - George Carlin
    Γα.... την πολιτική ορθότητα.

  3. #3
    Εγγραφή
    15-11-2009
    Περιοχή
    Ιωάννινα
    Ηλικία
    33
    Μηνύματα
    95
    Downloads
    0
    Uploads
    0
    ISP
    Forthnet
    Ευχαριστώ, έχει πολύ φασαρία

  4. #4
    Εγγραφή
    01-06-2008
    Ηλικία
    52
    Μηνύματα
    1.404
    Downloads
    2
    Uploads
    0
    Ταχύτητα
    8192/512
    ISP
    Forthnet
    DSLAM
    Forthnet - Ν. ΣΜΥΡΝΗ
    SNR / Attn
    8(dB) / 30(dB)
    Πέρα από αυτό που λέει ο 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
    }
    Ο δεύτερος τρόπος δουλεύει επειδή οι non-template functions έχουν προτεραιότητα σε σχέση με τις template functions.

    Εγώ θα προτιμούσα τον πρώτο τρόπο επειδή δείχνει ακριβώς αυτό που θέλεις να κάνεις (να εξειδικεύσεις το template σε σχέση με τον τύπο unsigned).

  5. #5
    Εγγραφή
    15-11-2009
    Περιοχή
    Ιωάννινα
    Ηλικία
    33
    Μηνύματα
    95
    Downloads
    0
    Uploads
    0
    ISP
    Forthnet
    MichaelSE, έαν δεν κάνω λάθος με αυτόν τον τρόπο εάν η παράμετρος είναι unsigned long int, unsigned short int, unsigned long long int, θα εκτελεστεί το σώμα1. Εγώ θέλω για όλα τα "unsigned [κατι]" να εκτελείτε το σώμα2 όχι μόνο για unsigned int, χωρίς να γράψω για το κάθε ένα ξεχωριστά

  6. #6
    Εγγραφή
    20-12-2005
    Μηνύματα
    3.228
    Downloads
    4
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    49997/4997
    ISP
    ΟΤΕ Conn-x
    DSLAM
    ΟΤΕ - ΞΑΝΘΗ
    Router
    Speedport W 724V
    SNR / Attn
    24,4(dB) / (dB)
    Παράθεση Αρχικό μήνυμα από MichaelSE Εμφάνιση μηνυμάτων
    Πέρα από αυτό που λέει ο 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
    }
    Ο δεύτερος τρόπος δουλεύει επειδή οι non-template functions έχουν προτεραιότητα σε σχέση με τις template functions.

    Εγώ θα προτιμούσα τον πρώτο τρόπο επειδή δείχνει ακριβώς αυτό που θέλεις να κάνεις (να εξειδικεύσεις το template σε σχέση με τον τύπο unsigned).
    Μάλλον θα ρωτήσω χαζομάρες αλλά ο 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
    Γα.... την πολιτική ορθότητα.

  7. #7
    Εγγραφή
    15-11-2009
    Περιοχή
    Ιωάννινα
    Ηλικία
    33
    Μηνύματα
    95
    Downloads
    0
    Uploads
    0
    ISP
    Forthnet
    Το ίδιο λέμε imitheos

  8. #8
    Εγγραφή
    06-10-2008
    Ηλικία
    35
    Μηνύματα
    515
    Downloads
    2
    Uploads
    0
    Ταχύτητα
    6144/1024
    ISP
    HOL
    DSLAM
    Forthnet - ΑΓΙΟΥ ΓΕΩΡΓΙΟΥ
    Router
    WAG54G2 Linksys
    Path Level
    Interleaved
    Το ίδιο με τον ιμίθεο θα σου γράψω απλά αντί να έχω το 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.

  9. #9
    Εγγραφή
    01-06-2008
    Ηλικία
    52
    Μηνύματα
    1.404
    Downloads
    2
    Uploads
    0
    Ταχύτητα
    8192/512
    ISP
    Forthnet
    DSLAM
    Forthnet - Ν. ΣΜΥΡΝΗ
    SNR / Attn
    8(dB) / 30(dB)
    Παράθεση Αρχικό μήνυμα από void90 Εμφάνιση μηνυμάτων
    MichaelSE, έαν δεν κάνω λάθος με αυτόν τον τρόπο εάν η παράμετρος είναι unsigned long int, unsigned short int, unsigned long long int, θα εκτελεστεί το σώμα1. Εγώ θέλω για όλα τα "unsigned [κατι]" να εκτελείτε το σώμα2 όχι μόνο για unsigned int, χωρίς να γράψω για το κάθε ένα ξεχωριστά
    Έτσι είναι όπως τα λες. Συγγνώμη, δεν κατάλαβα αυτό που εννοούσες, γιατί στη C++ ο τύπος unsigned και ο unsigned int ταυτίζονται (όπως λες κι εσύ). Γι΄αυτό θεωρούσα ότι όταν λες unsigned εννοείς unsigned int.

    Για να γίνει αυτό που λες χρειάζεται να κάνεις overload κάθε τύπο ξεχωριστά. Γιατί παρόλο που λεξικογραφικά οι τύποι unsigned int και unsigned long long int μοιάζουν, στην πραγματικότητα είναι διαφορετικοί.

    Παράθεση Αρχικό μήνυμα από imitheos Εμφάνιση μηνυμάτων
    Μάλλον θα ρωτήσω χαζομάρες αλλά ο 2ος τρόπος που δεν χρησιμοποιεί template είναι δηλαδή μια απλή overloaded function ?

    Ακόμη, και στους δύο τρόπους η 2η συνάρτηση παίζει για όλους τους τύπους ? Έτσι που την διαβάζω μου δίνει την εντύπωση ότι θα παίζει μόνο για unsigned int αλλά δεν γνωρίζω πως πάνε αυτά στη c++.
    Όχι, δεν είναι χαζομάρες αυτό που ρωτάς, αντίθετα μάλιστα, είναι και ο λόγος που έγραψα και παραπάνω ότι εγώ προτιμάω τον πρώτο τρόπο δήλωσης. Γιατί όντως ο δεύτερος τρόπος είναι μία απλή overloaded function και δεν σου δίνει καθόλου να καταλάβεις ότι είναι specialization του template. Γι' αυτόν το λόγο μπορεί να οδηγήσει σε παρανοήσεις στον κώδικα.

    Για το δεύτερο που λες, έχεις δίκιο, είναι αυτό που απάντησα και στον void90. Ήταν δικό μου λάθος γιατί δεν κατάλαβα τι ρώτησε εξαρχής.

  10. #10
    Εγγραφή
    15-11-2009
    Περιοχή
    Ιωάννινα
    Ηλικία
    33
    Μηνύματα
    95
    Downloads
    0
    Uploads
    0
    ISP
    Forthnet
    Ευχαριστώ για τις απαντήσεις, η λύση του xcyanx φαίνεται πιο ωραία, να'στε καλά

Παρόμοια Θέματα

  1. πρόβλημα templates
    Από psithike στο φόρουμ Web authoring, development & web design
    Μηνύματα: 3
    Τελευταίο Μήνυμα: 07-06-12, 01:27
  2. Έτοιμα templates
    Από Antonis94 στο φόρουμ Web authoring, development & web design
    Μηνύματα: 10
    Τελευταίο Μήνυμα: 17-06-09, 11:57
  3. Δωρεάν Web Templates
    Από drkameleon στο φόρουμ Internet, web surfing και online υπηρεσίες
    Μηνύματα: 12
    Τελευταίο Μήνυμα: 04-05-09, 08:36
  4. Πρόβλημα με Templates σε TG585v7
    Από Spanos στο φόρουμ Alcatel Thomson ADSL modems και routers
    Μηνύματα: 13
    Τελευταίο Μήνυμα: 18-12-08, 20:24
  5. free templates
    Από Knorcedger στο φόρουμ Web authoring, development & web design
    Μηνύματα: 3
    Τελευταίο Μήνυμα: 27-08-06, 16:30

Bookmarks

Bookmarks

Δικαιώματα - Επιλογές

  • Δεν μπορείτε να δημοσιεύσετε νέα θέματα
  • Δεν μπορείτε να δημοσιεύσετε νέα μηνύματα
  • Δεν μπορείτε να αναρτήσετε συνημμένα
  • Δεν μπορείτε να επεξεργαστείτε τα μηνύματα σας
  •  
  • Τα BB code είναι σε λειτουργία
  • Τα Smilies είναι σε λειτουργία
  • Το [IMG] είναι σε λειτουργία
  • Το [VIDEO] είναι σε λειτουργία
  • Το HTML είναι εκτός λειτουργίας