* Nicht zu verwechseln mit Assoziativen Arrays.Aufrufen einer assoziativen * Funktion mit C-Makros
Ich weiß, wie man eine Funktion in C mit Makros vektorisiert, um Ergebnisse ähnlich der Mathematica Map (oder Apply) -Funktionalität zu geben. Nämlich eine Funktion auf eine Liste von Argumenten anwenden.
#define Apply(type, function, ...) \
{ \
void *Stop = (int[]){0}; \
type **List = (type*[]){__VA_ARGS__, Stop}; \
for(int i = 0; List[i] != Stop; ++i) \
function(List[i]); \
}
Ich kann dann wie
etwas tun#define FreeAllAtOnce(...) Apply(void, free, __VA_ARGS__);
, die die Wirkung hat, dass
free(Array1);
free(Array2);
free(Array3);
zu
FreeAllAtOnce(Array1, Array2, Array3);
ich, dass nicht machen up entspricht, Ich habe darüber in einem Buch gelesen und habe es h benutzt seither.
Meine Frage ist: Kann ich etwas Ähnliches tun, um ein Array über einige Binärfunktionen assoziativ zu kombinieren. Nehmen Sie zum Beispiel die GCD-Funktion. Ich möchte eine Funktion wie:
GCD_all(a, b, c, d, e);
, dass die gleiche Wirkung wie
GCD(GCD(GCD(GCD(a, b), c), d), e);
für eine beliebige Anzahl von Argumenten hat.
Ich habe versucht, dies zu tun und war nicht in der Lage, es richtig funktionieren zu lassen. Ich bin auch an dem Fall interessiert, bei dem zusätzliche Parameter an die Funktion übergeben werden können. Im allgemeinsten Sinne freue ich dies wie mit Funktionen zu tun:
Atype BinaryCombine(Atype a, Atype b, OtherType z, OtherType y)
, so dass ich eine Funktion haben
Atype BinaryCombineAll(Atype a, Atype b, Atype c, Atype d, OtherType z, OtherType y)
Ich hoffe, das macht Sinn. Irgendwelche Ideen oder Hilfe würden sehr geschätzt!
Danke.
Ich denke, Sie hätten etwas Erfolg mit C++ 11 variadic Vorlagen haben können – ForceBru
BTW, wie willst du herausfinden, wie viele Argumente 'Funktion' dauern kann? – ForceBru
@ForceBru, ich bin daran interessiert, in C zu bleiben. In meinem ersten Beispiel Funktion nur ein Argument. Wonach ich frage, ist eine, die zwei (oder mehr) braucht. – amcalde