Re[2]: Переделать макрос в функцию
От: rg45 СССР  
Дата: 03.09.09 13:10
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Аноним, Вы писали:


А>>Сабж. Как можно сделать подобное в этом коде? Если бы не поле operand, то делается всё просто.

А>>...

R>Давненько я такого кошмара не видел, это во истину шедевр А переделать макрос FUNC в функцию без изменения окружающего кода невозможно по той простой причине, этот макрос ветвит вызывающий код на целых три(!) ветки.


Чтобы не выглядеть неконструктивным критиканом, предложу вариант рефакторинга. Хотя, сразу должен сказать, что у меня возникли сомнения в том, что автор этого кода понимал ЧТО он делает. Особенно странным выглядит множественный вызов функции fillbuff в то время, когда выполняется анализ результата этой же функции.

Тем, не менее, не смотря на кажущуюся (мне, по крайней мере) бессмысленность этого кода, предложенный ниже вариант по своему эффекту полностью идентичен исходному.
int main()
{
  struct
  {
    int result_code;
    int foo::*field; 
  } cases[] = {
    {1, &foo::foo_a},
    {2, &foo::foo_b},
    {3, &foo::foo_c},
  };

  const int cases_count = sizeof(cases) / sizeof(*cases);

  barstruct bar;
  char * buf;

  if (fillbuff(buf) == 0) 
    return 0;

  for (int i = 0; i < cases_count; ++i)
    if (fillbuff(buf) == cases[i].result_code)
    {
      foo * f = bar.get_foo( bar.c );
      if(!f)
        break;
      return f->*cases[i].field;
    }
}
--
Справедливость выше закона. А человечность выше справедливости.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.