2017-01-09 15 views
-3

私は、このように私はこのような多くのケースでswitchを持って、多くのfuncionsをサポートして逆ポーランド記法の評価を書いた:このコードを生成するマクロを作成するにはどうすればよいですか?

テンプレートは、同じ1つの引数を必要とするすべての関数について
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; 
} 

をしかし、マクロでこれを行うには非常に醜いです。私はこれを違ったやり方でやります。

関連する問題