2016-04-17 7 views
3

Я хочу использовать C Общий выбор для вывода функции с использованием двух факторов вместо одного. Скажем, у меня есть этот C файл:C Общий выбор с двумя типами

#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 должен решать вызов функции. Есть ли способ сделать это?

+0

Вы, вероятно, следует сделать эти параметры Struct 'константный тип структуры *' вместо этого. – 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

 Смежные вопросы

  • Нет связанных вопросов^_^