21

Re: Функція, що повертає вказівник на саму себе

На роботі зтикнувся з дуже подібною задачою і ми застосували структури як контейнери для вказівника на функцію заданої сіґнатури.

Якщо брати за основу старий код з приведеням типів і переписати його на структури, то буде :

#include <stdio.h>

typedef union fptr_inside func_type;
typedef func_type (*fptr)(int);
union fptr_inside { fptr f; };

func_type func(int n) {
    printf(" %i", n);
    return (func_type){ .f = func };
}
int main() {
    printf("\r\n start");
    func_type f = { .f = func };
    for(int i = 0; i < 5; ++i)
        f = f.f(i);
    printf("\r\n -----");
    func(0).f(1).f(2);
    printf("\r\n finish");
}

Фокус в тому, що на лінії
typedef union fptr_inside func_type;
сам union fptr_inside { ... } ще не існує. Ми його означимо після того як всі typedef'и відпрацюють.

Також замість union можна давати struct.

Це досить зручно, накладає на типи саме ті обмеженя які ми хотіли, і залишає підказки для розробника.

Подякували: ReAl, P.Y.2

22

Re: Функція, що повертає вказівник на саму себе

leofun01 написав:
    func_type f = { .f = func };
    for(int i = 0; i < 5; ++i)
        f = f.f(i);

або так :

    fptr f = func;
    for(int i = 0; i < 5; ++i)
        f = f(i).f;

23

Re: Функція, що повертає вказівник на саму себе

офтоп (про C++)
leofun01 написав:
typedef union fptr_inside func_type;
typedef func_type (*fptr)(int);
union fptr_inside { fptr f; };

в C++ (11+) замість typedef треба using :

using func_type = union fptr_inside;
using fptr = func_type (*)(int);
union fptr_inside { fptr f; };