プリプロセッサでプリコンパイル計算を行うためにBOOST_PPを使用しています。私は、コードサイズが非常に重要なアプリケーションに焦点を当てています。(したがって、コンパイラーがそうすべきである、または通常そうするべきであるとは言わないでください。コンパイル時に実行されるものと生成されるコードを制御する必要があります)。ただし、整数定数と変数の両方に同じ名前のマクロ/関数を使用できるようにしたいと思います。ささいな例として、私は持つことができます
#define TWICE(n) BOOST_PP_MUL(n,2)
//.....
// somewhere else in code
int a = TWICE(5);
これは私が望んでいることを行い、
int a = 10;
コンパイル時。
でも、
int b = 5;
int a = TWICE(b);
これは前処理する必要があります
int b = 5;
int a = 5 * 2;
もちろん、私は次のような従来のマクロを使用してそうすることができます
#define TWICE(n) n * 2
しかし、整数定数に対して私が望んでいることは実行されません(コンパイル時にそれらを評価します)。
だから、私の質問は、引数がリテラルか変数かをチェックしてから、異なる定義を使用するトリックがありますか?つまり、次のようなものです。
#define TWICE(n) BOOST_PP_IF( _IS_CONSTANT(n), \
BOOST_PP_MUL(n,2), \
n * 2 )
編集:それで、私が本当に求めているのは、コンパイル時に何かが利用可能な定数であるかどうかを確認する方法です。したがって、BOOST_PP_関数の適切な引数です。これは、ほとんどの人がプリプロセッサや一般的なプログラミングの推奨事項に期待するものとは異なることを理解しています。しかし、プログラミングの間違った方法はありませんので、その哲学に同意できない場合は、質問を嫌いにならないでください。BOOST_PPライブラリが存在するのには理由があり、この質問も同じ精神です。しかし、それは不可能かもしれません。