2017-01-09 61 views
-3

我写了支持许多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; 
} 

但它是很丑陋与宏做到这一点。我会做不同的事情。

相关问题