Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Zabrana instanciranja šablona za određeni tip?

[es] :: C/C++ programiranje :: Zabrana instanciranja šablona za određeni tip?

[ Pregleda: 2625 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Časlav Ilić
Braunšvajg, Nemačka

Član broj: 4945
Poruke: 565
*.lstm.uni-erlangen.de.



+27 Profil

icon Zabrana instanciranja šablona za određeni tip?13.03.2006. u 10:58 - pre 220 meseci
Mogu li nekako da zabranim instanciranje šablona (dobijem grešku pri kompilaciji) za neki određeni tip, za koji bi se šablon inače mogao instancirati?

Na primer, ako je šablon:

Code:
template <typename A>
int myWheel (const A &a) {
    return sizeof(a);
}


želim da se ne može instancirati za char:

Code:
int i;
myWheel(i); // može
char c;
myWheel(c); // ne može
 
Odgovor na temu

NrmMyth
Ivan Maček
Split

Član broj: 63456
Poruke: 849
*.net.t-com.hr.

Sajt: www.dump.hr


Profil

icon Re: Zabrana instanciranja šablona za određeni tip?13.03.2006. u 11:23 - pre 220 meseci
pogledaj predprocesorske direktive... mozda nadjes nesto tamo.
Sad samu u zurbi pa ne mogu to napraviti za tebe.
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.dsl.pipex.com.



+4 Profil

icon Re: Zabrana instanciranja šablona za određeni tip?13.03.2006. u 13:21 - pre 220 meseci
Koristi specijalizaciju templejta. Recimo:
Code:

template <>
int myWheel (const char &a) 
{
#error "No can do!!!!";
};


Ovo daje compile-time error, naravno.


[Ovu poruku je menjao NastyBoy dana 13.03.2006. u 14:23 GMT+1]
 
Odgovor na temu

Časlav Ilić
Braunšvajg, Nemačka

Član broj: 4945
Poruke: 565
*.lstm.uni-erlangen.de.



+27 Profil

icon Re: Zabrana instanciranja šablona za određeni tip?13.03.2006. u 13:41 - pre 220 meseci
Eh, nije da nije i meni sevnulo, ali to nažalost daje grešku još pre kompilacije...
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.dsl.pipex.com.



+4 Profil

icon Re: Zabrana instanciranja šablona za određeni tip?13.03.2006. u 13:54 - pre 220 meseci
Sorry, my bad. Napisao sam u zhurbi, zaboravio da se to evaluira bez obzira na instanciranje.

Elem, zameni ono #error sa jednim
Code:

assert(0 && "Ne mozhe se instancirati char templejt!");
return -1;

i to je to. Mada ovako dobijash run-time umesto compile-time greshke.

[Ovu poruku je menjao NastyBoy dana 13.03.2006. u 14:55 GMT+1]
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.dsl.pipex.com.



+4 Profil

icon Re: Zabrana instanciranja šablona za određeni tip?13.03.2006. u 14:04 - pre 220 meseci
Da dodam - za compile time error deklarishi specijalizovani templejt, ali NEMOJ da ga implementirash. Ako neko koristi char-specijalizaciju dobice linker-error.
 
Odgovor na temu

Časlav Ilić
Braunšvajg, Nemačka

Član broj: 4945
Poruke: 565
*.lstm.uni-erlangen.de.



+27 Profil

icon Re: Zabrana instanciranja šablona za određeni tip?13.03.2006. u 14:29 - pre 220 meseci
Nije vala loše ni da pukne pri povezivanju, tek da samo da se program ne izgradi do kraja. Nisam o tome razmišljao, zahvaljujem.

(Mada, ako se neko doseti kako da pukne pri kompilaciji, neka ga ne mrzi da objasni :)
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.lionbridge.com.



+6 Profil

icon Re: Zabrana instanciranja šablona za određeni tip?13.03.2006. u 16:17 - pre 220 meseci
Nisu mi knjige pri ruci, ali proguglaj malo "compile time asserts"
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
..81.static.gus.vf.siwnet.net.

Sajt: dejan.lekic.org


+2 Profil

icon Re: Zabrana instanciranja šablona za određeni tip?13.03.2006. u 16:45 - pre 220 meseci
Code:

/*********************************************************\
file:        notinst.cpp
compile:     g++ notinst.cpp -o notinst
run:         ./notinst
author(s):   Dejan Lekic, http://dejan.lekic.org
\*********************************************************/

#include <cassert>
#include <iostream>

template <typename A>
int myWheel (const A &a) 
{
    // If You do not want to break the application change assert() to if() .
    assert(typeid(a) != typeid(char));
    return sizeof(a);
}

struct TmpStruct
{
    int one;
    double two;
    std::string three;
};

int main(int argc, char** argv)
{
    char tmp1 = 'd';
    int tmp2 = 5;
    TmpStruct oTmp;
    std::cout << myWheel(tmp2) << std::endl; // OK
    std::cout << myWheel(tmp1) << std::endl; // !OK
    std::cout << myWheel(oTmp) << std::endl; // OK
    return 0;
}


[Ovu poruku je menjao leka dana 13.03.2006. u 17:47 GMT+1]
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.dsl.pipex.com.



+4 Profil

icon Re: Zabrana instanciranja šablona za određeni tip?13.03.2006. u 18:15 - pre 220 meseci
Citat:
Nisu mi knjige pri ruci, ali proguglaj malo "compile time asserts"


Da, Alexandrescu ima celo poglavlje na temu "compile-time assert", ali nemam ni ja knjige pri ruci niti se trenutno secam kako to tachno ide :)

Prepisacu to reshenje ovde kasnije vecheras
 
Odgovor na temu

Časlav Ilić
Braunšvajg, Nemačka

Član broj: 4945
Poruke: 565
*.lstm.uni-erlangen.de.



+27 Profil

icon Re: Zabrana instanciranja šablona za određeni tip?13.03.2006. u 18:19 - pre 220 meseci
(Leko: treba da pukne pri kompilaciji, ne u radu)

Po Nemanjinom uputu (svaka mu se dala), proguglah za tim statičkim potvrdama, i sastavih nešto ovako:

Code:
template <typename T> class TypeValid { public: static const int ok = 1; };
template <> class TypeValid<char> { public: static const int ok = 0; };
#define STATIC_ASSERT_NOT_CHAR(T) switch(0) {case 0: case TypeValid<T>::ok:;}

template <typename A>
int myWheel (const A &a) {
    STATIC_ASSERT_NOT_CHAR(A);
    return sizeof(a);
}

int main () {
    int i;
    myWheel(i); // compiles
    char c;
    myWheel(c); // error, duplicate case
}


Pitam se sad:

1) može li elegantnije, i

2) umesto da kompilator samo kaže kako je dupliran slučaj, mogu li nekako da proturim svoju poruku, makar i uvijeno (npr. ime nedeklarisane promenljive)?
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.dsl.pipex.com.



+4 Profil

icon Re: Zabrana instanciranja šablona za određeni tip?13.03.2006. u 18:31 - pre 220 meseci
Citat:
2) umesto da kompilator samo kaže kako je dupliran slučaj, mogu li nekako da proturim svoju poruku, makar i uvijeno (npr. ime nedeklarisane promenljive)?


Mozhe, bash to je u Alexandrescu-ovoj knjizi. Mozhda je okachio to poglavlje na svom sajtu. Ako ne, postovacu ja to ovde kasnije.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.lionbridge.com.



+6 Profil

icon Re: Zabrana instanciranja šablona za određeni tip?13.03.2006. u 18:43 - pre 220 meseci
Da, evo ga ovde: http://www.openoffice.org/serv...?msgId=930121&listName=dev

 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
..81.static.gus.vf.siwnet.net.

Sajt: dejan.lekic.org


+2 Profil

icon Re: Zabrana instanciranja šablona za određeni tip?13.03.2006. u 19:18 - pre 220 meseci
Da, izvinjavam se jer nisam obratio paznju da treba prekinuti kompajliranje... Da bi se izvelo to sto hoces covek mora da napravi neku zestoku budzavinu...

Da malo odletim sa teme - programski jezik D ima "static assert" kao deo jezika, bilo bi lepo da C++ ima nesto slicno...
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

Časlav Ilić
Braunšvajg, Nemačka

Član broj: 4945
Poruke: 565
*.lstm.uni-erlangen.de.



+27 Profil

icon Re: Zabrana instanciranja šablona za određeni tip?13.03.2006. u 20:04 - pre 220 meseci
Po još jednom Tatinom hirurškom uputu, evo i kraće i s „porukom“:

Code:
#define ERR_MSG Dont_you_know_that_char_is_not_a_wheel
template <typename T> class TypeValid {public: static void ERR_MSG () {}};
template <> class TypeValid<char> {};
#define STATIC_ASSERT_NOT_CHAR(T) TypeValid<T>::ERR_MSG ();

template <typename A>
int myWheel (const A &a) {
    STATIC_ASSERT_NOT_CHAR(A);
    return sizeof(a);
}

int main () {
    int i;
    myWheel(i); // compiles
    char c;
    myWheel(c); // error, ERR_MSG not a member function
}


Citat:
leka:
Da bi se izvelo to sto hoces covek mora da napravi neku zestoku budzavinu...

Počinje da mi se čini da Đavoljev najveći uspeh nije što je ubedio ljude da ne postoji, već što je naterao izvesnog Danca da...
 
Odgovor na temu

NrmMyth
Ivan Maček
Split

Član broj: 63456
Poruke: 849
*.net.t-com.hr.

Sajt: www.dump.hr


Profil

icon Re: Zabrana instanciranja šablona za određeni tip?13.03.2006. u 21:46 - pre 220 meseci
Trudim se shvatiti, ali je previse
Citat:
#define ERR_MSG Dont_you_know_that_char_is_not_a_wheel
template <typename T> class TypeValid {public: static void ERR_MSG () {}};

Jeli moguce napisati funkciju koja ima isto ime kao i predprocesorski string.

Onda kasnije pukne jer nije nesto tu kako treba...

Nemam knjige kraj sebe pa ne mogu puno mozgati. Ako mozete pojasniti ovo.
Hvala.
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.verat.net.



+9 Profil

icon Re: Zabrana instanciranja šablona za određeni tip?13.03.2006. u 23:26 - pre 220 meseci
Moguće je napisati isto ime funkcije i predkompajlerskog stringa... upravo zato što to prvo prolazi predprocesor, pa tek onda ide na kompajliranje.

[Ovu poruku je menjao Goran Arandjelovic dana 14.03.2006. u 00:27 GMT+1]
 
Odgovor na temu

NrmMyth
Ivan Maček
Split

Član broj: 63456
Poruke: 849
*.cmu.carnet.hr.

Sajt: www.dump.hr


Profil

icon Re: Zabrana instanciranja šablona za određeni tip?14.03.2006. u 22:22 - pre 220 meseci
Tocno, krivo sam vidio gore, ucinilo mi se da je string, a nije.

Jasno mi je sad. MALO konfuzno na prvo oko.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Zabrana instanciranja šablona za određeni tip?

[ Pregleda: 2625 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.