Prikaz jedne poruke
Stara 20.7.2014, 11:51   #11
ivan90BG
Veteran
 
Član od: 3.5.2008.
Lokacija: Beograd
Poruke: 760
Zahvalnice: 81
Zahvaljeno 213 puta na 144 poruka
Određen forumom Re: [C++] Unity sistem komponenti

Ту синтаксу сам приметио пре неколико месеци и тражио по интернету. То је синтакса за функцијске типове. Када се напише
Kod:
typedef float Potpis1(const char*, int);
није декларисан показивач на функцију, нити било какав тип који има величину у меморији. Декларисан је и именован потпис функције. Ако се као тип параметра неке функције наведе Potpis1 то је као да је декларисан показивач на функцију као параметар.
Kod:
float uradiNesto(Potpis1 func) {
    return func("blabla", 42);
}
Али ако се декларише члан класе овог типа то је исто као да је декларисана метода са тим потписом:
Kod:
struct A {
    Potpis1 metoda;
};
float A::metoda(const char* str, int num) {
    //...
}
int main() {
    A a;
    a.metoda("bla bla", 42);
}
Али ово не ради ако је тип добијен као темплејт аргумент. Следећи код ће проузроковати компајлерску грешку при инстанцирању темплејта:
Kod:
template<typename T> struct B {
    T clan;
};
int main() {
    B<void()> b;
    b.clan();
};
Није могуће да се из темплејт параметра на овај начин узме потпис методе јер нема начина да се дефинише тело методе. Једино је могуће помоћу форе са парцијалном специјализацијом за екстрактовање елемената потписа из темплејт аргумента, коју је Belphegor написао.
ivan90BG je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku ivan90BG na korisnoj poruci:
Belphegor (20.7.2014)