2016-04-17 20 views
3

使用したいC汎用選択では、1つではなく2つの要素を使用して関数を推論します。C 2種類の汎用選択

#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` 
} 
draw(X, Y)

XなどY関数呼び出しを決める必要があります。 のは、私はこのCファイルがあるとしましょう。これを行うにはいくつかの方法がありますか?

+0

をあなたはおそらく、これらの構造体のパラメータの代わりに 'constの構造体型*'を行う必要があります。 – Lundin

答えて

4

私はそれをテストすることができませんでしたので、私は申し訳ありません便利C11コンパイラを持っていないが、おそらくあなたはこの試みることができる:

#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

私はあなたの答えを試して、いくつかのカンマを削除し、それは働いた。それは私が思ったよりも簡単です。あなたの答えを編集して正しいものにしました。 – hgiesel

関連する問題