Ту синтаксу сам приметио пре неколико месеци и тражио по интернету. То је синтакса за функцијске типове. Када се напише
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 написао.