Definicja wskaźnika mogąca pokazać na funkcję jak w poście

0
int F( int(*w)(void))

jak powinien wyglądać wskaźnik mogący pokazać na to funkcję ?

2

Robisz:

typedef int Funkcja(int (*w)(void));

I potem można:

Funkcja *wskaznik_na_funkcje = ...;

I już. To przynajmniej powoduje, że da się to czytać. Hint: typedef już powinien być użyty w tym "wewnętrznym" wskaźniku na funkcję.

0

a inaczej bez typedef ?

Znalazłem coś takiego:

int (*w)( int(*)(void); 

Tylko nie wiem czy to dobrze ? i co oznacza ten pierwszy (*w)

0

Brakuje Ci ostatniego nawiasu. (*w) oznacza w tym przypadku, że w jest wskaźnikiem, a nie jego zwracanym typem jest wskaźnik, jak by było w przypadku bez nawiasu. Dlaczego nie spróbujesz użyć dostępnych narzędzi?

0

Ale dlaczego bez typedef? Przecież po to to zostało wymyślone. :-/

Kto Was tego uczy?! Przecież to jest nienormalne, żeby uczyć się jak ma wyglądać jakiś dwudziestokrotnie zagnieżdżony wskaźnik do funkcji zwracającej tablicę wskaźników do funkcji, która przyjmuje funkcję przyjmującą tablicę wskaźników do funkcji itd, itd. To nie ma żadnego sensu, bo to jest niepotrzebne w programowaniu. Używa się takich konstrukcji, żeby dało się je zrozumieć, a kiedy sprawy się komplikują używa się narzędzi języka do upraszczania rzeczy. Mimo swojego skomplikowania, C++ o dziwo dostarcza takie narzędzia - np. typedef.

Jeżeli chcesz się uczyć C++ to dowiedz się co to jest typedef. Jeżeli nie, to powinno być po prostu:

int (*F)(int (*)(void));

wstawiasz kolejną gwiazdkę i nawias wzorem argumentu i dostajesz takiego potwora.

0
typedef int(*wfunc)(void);

int F(wfunc w);

typedef int (*ffunc)(wfunc);

ffunc wsk = F;
1

Uzyj std::function<>, ewentualnie parametru generycznego na funkcje i zapomnij o tym, ze te przeklete gwiazdki istnieja.

0

To jeszcze raz:

typedef int(*wfunc)(void);

wfunc jest typem wskaźnika na funkcję bezparametrową zwracającą int.

int F(wfunc w) { return 0; }

F jest funkcją pobierającą parametr typu wfunc (czyli wskaźnik na funkcję bezparametrową zwracającą int) i zwracającą int.

typedef int (*ffunc)(wfunc);

ffunc jest typem wskaźnika na funkcję pobierającą parametr typu wfunc i zwracającą int.

ponieważ typ ffunc odpowiada deklaracji funkcji F (pobiera wfunc i zwraca int), można stworzyć zmienną typu ffunc wskazującą na funkcję F:

ffunc wsk = F;

Dzięki temu unikasz potworków takich jak int (*F)(int (*)(void)) bo wszystko ma swoją nazwę.

0

A jeszcze lepiej tak:

typedef int wfunc();
int F(wfunc *w) { return w(); }
typedef int ffunc(wfunc*);
ffunc *wsk=&F;

wtedy unikasz dziwacznych zapisów oraz widzisz wyraźnie co jest wskaźnikiem.

0

Skoro już mówimy jak jest lepiej, to dla mnie czytelniejsze by było coś takiego:

template <typename T>
using function_ptr = typename add_pointer<typename enable_if<is_function<T>::value,T>::type>::type;

int F(function_ptr<int()> w){ return w(); }
typedef function_ptr<int(function_ptr<int()>)> ffunc;

A potem ewentualna zamiana tego na std::function byłaby trywialna.

1 użytkowników online, w tym zalogowanych: 0, gości: 1