2016-04-17 8 views
3

Ich möchte verwenden C Generische Auswahl, um die Funktion durch die Verwendung von zwei Faktoren statt nur einer abzuleiten. Lassen Sie uns sagen, ich habe diese C Datei:C Generische Auswahl mit zwei Typen

#define draw(X, Y) \ 
     _Generic((X), \ 
     struct circle: draw_circle, \ 
     struct square: draw_square \ 
     )(X, Y) 

struct circle{}; 
struct square{}; 

void draw_circle_with_int(struct circle a, int i){} 
void draw_circle_with_double(struct circle a, double d){} 
void draw_square_with_int(struct square a, int i){} 
void draw_sqaure_with_double(struct square a, double d){} 

int main(void) 
{ 
    struct circle c; 
    /* draw(c, 3); */ // `draw_circle_with_int` 
    /* draw(a, 3.5); */ // `draw_circle_with_double` 

    struct square s; 
    /* draw(s, 5); */ // `draw_square_with_int` 
    /* draw(s, 5.5); */ // `draw_square_with_double` 
} 

In draw(X, Y), X sowie Y sollte den Funktionsaufruf entscheiden. Gibt es einen Weg, dies zu tun?

+0

Sie sollten wahrscheinlich diese Struktur Parameter 'const Strukturtyp machen *' statt. – Lundin

Antwort

4

Ich habe nicht ein C11-Compiler praktisch leider so konnte ich es nicht testen, aber vielleicht könnten Sie dies versuchen:

#define draw(X, Y) \ 
     _Generic((X), \ 
      struct circle: _Generic((Y), \ 
       int: draw_circle_with_int, \ 
       double: draw_circle_with_double), \ 
      struct square: _Generic((Y), \ 
       int: draw_square_with_int, \ 
       double: draw_square_with_double) \ 
     )(X, Y) 
+0

Ich habe es ausprobiert, einige Kommas entfernt und es hat funktioniert. Es ist einfacher als ich dachte. Ich habe Ihre Antwort bearbeitet, um sie korrekt zu machen. – hgiesel

Verwandte Themen