C++ 如何创建宏来生成此代码?

C++ 如何创建宏来生成此代码?,c++,math,postfix-notation,C++,Math,Postfix Notation,我编写了一个反向波兰符号求值器,它支持许多函数,因此我有一个开关,有很多类似的情况: case 'b': { if (stack.size() < 1) fail(); pop(l1, stack); l1 = log(l1); push(l1, stack); break; } 案例“b”:{ 如果(stack.size()

我编写了一个反向波兰符号求值器,它支持许多函数,因此我有一个
开关
,有很多类似的情况:

case 'b': {
    if (stack.size() < 1) fail();
    pop(l1, stack);
    l1 = log(l1);
    push(l1, stack);
    break;
}
案例“b”:{
如果(stack.size()<1)失败();
pop(l1,堆栈);
l1=对数(l1);
推送(l1,堆栈);
打破
}

对于所有需要一个参数的函数,模板是相同的,唯一的变化是
大小写
字符和
l1=。如何创建一个宏来生成此未测试的
案例

,但这应该可以工作:

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

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;
}
案例“b”:{
如果(stack.size()<1)失败();
pop(l1,堆栈);
l1=对数(l1);
推送(l1,堆栈);
打破
}
案例“c”:{
如果(stack.size()<1)失败();
pop(l1,堆栈);
l1=其他函数(l1);
推送(l1,堆栈);
打破
}

但是用宏来做这件事是很难看的。我会用不同的方法来做。

为什么不写一个函数而不是宏?你能自己演示一下解决这个问题的方法吗?替代方法:在
字符
和函数之间映射。然后你可以
操作符[opcode]()不需要开关。@jaggedSpire你能给点建议吗?还是我需要获得更多的反对票?对不起,我不明白this@Matteo差不多。我更改了一些函数调用,以便在为
堆栈
变量使用向量时不需要太多样板文件,因为我不知道代码的完整上下文,但这应该给您提供一个不错的示例。您也可以用一种不通过引用捕获
堆栈
的方式来编写它,而是将整个过程作为一个外部函数来编写。
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;
}