2017-01-09 4 views
-3

я написал Reverse Polish Notation оценщика, который поддерживает множество funcions, таким образом, у меня есть switch с многими случаями как этот:Как создать макрос для создания этого кода?

case 'b': { 
    if (stack.size() < 1) fail(); 
    pop(l1, stack); 
    l1 = log(l1); 
    push(l1, stack); 
    break; 
} 

Для всех функций, которые требуют один аргумента шаблона является то же самым, единственным изменением является символом case и l1 = ...;. Как создать макрос, который генерирует этот case.

+6

Почему бы не написать функцию вместо макроса? – jaggedSpire

+1

Можете ли вы продемонстрировать * любое * усилие при решении этого самостоятельно? –

+3

Альтернатива: [Посмотрите на использование 'std :: map'] (http://en.cppreference.com/w/cpp/container/map) для отображения между символом' char' и функцией. Тогда вы можете 'operator [opcode]();' Нет необходимости в переключении. – user4581301

ответ

1

непроверенная, но это должно работать:

#define THEMACRO(charfunc, functionname) \ 
    case charfunc: { \ 
     if (stack.size() < 1) fail(); \ 
     pop(l1, stack); \ 
     l1 = functionname(l1); \ 
     push(l1, stack); \ 
     break; \ 
    } 

Теперь вы можете написать:

THEMACRO('b', log) 
THEMACRO('c', someotherfunction) 

вместо:

case 'b': { 
    if (stack.size() < 1) fail(); 
    pop(l1, stack); 
    l1 = log(l1); 
    push(l1, stack); 
    break; 
} 
case 'c': { 
    if (stack.size() < 1) fail(); 
    pop(l1, stack); 
    l1 = someotherfunction(l1); 
    push(l1, stack); 
    break; 
} 

Но это довольно некрасиво, чтобы сделать это с помощью макросов , Я бы сделал это по-другому.