Ich arbeite derzeit an einem Projekt, welches verlangt, dass ich eine generische Funktion habe und je nachdem welcher Datentyp tatsächlich vorliegt in eine andere Funktion springe. Bspw. habe ich die Funktion brighten. Die such anhand der Information ob ein RGB, RGBA, CMYK, ...-Bild vorliegt nach der passenden Funktion und führt die dann aus. Das Ganze soll natürlich in O(1) laufen. Außerdem will ich zur Programmierzeit recht leicht neue Funktionen hinzufügen können bzw. durch Setzen von Konstanten zur Compilezeit Typen entfernen lassen können.
Mein aktueller Ansatz wäre ein enum zu haben mit den Bilddatentypen (RGB=0, RGBA=1, ..) und entweder ein struct oder ein Array von Funktionen derart:
Code: Alles auswählen
struct brighten {
void (*brightenRGB) (struct Image* img, ...);
void (*brightenRGBA) (struct Image* img,... );
// ...
};
// bzw.
void* brighten_fct [ /** todo **/ ] = { (void*) brightenRGB, (void*) brightenRGBA, NULL, (void*) brightenCMYK };
PS: Suchen gänge bei beiden mithilfe des Enum-Werts als Offset. Allerdings müssten bei Fehlen von Funktionen die höheren Enum-Werte trotzdem belegt werden, d.h. dürfen nicht weiter nach vorn rutschen. Das ist aber kein Problem.
PPS: Gesucht sind ausschließlich C99 Lösungen. Kein C++ und preferabel kein neueres C. Am liebsten auch keine stdlib.
Fällt jemandem von euch eine schlauere Idee ein? Alles was dynamisches Laden oder dynamisches Speichermanagment voraussetzt ist nicht möglich, weil ich die Library auch gerne low level einsetzen können will (mal sehen wie das ausgeht...)
MfG Naums