プリプロセッサ力を再定義して、以前の定義を使用するには
-
21-09-2019 - |
質問
のアップデート3 の
ネヴァーマインド。私はちょっと私が探していたものです。以下は、クラス内で一意の識別子を与えます。
static const int _counter_start = __COUNTER__;
static const int val1 = __COUNTER__ - _counter_start;
static const int val2 = __COUNTER__ - _counter_start;
のアップデート2 の
私はこの機能を持つメッセージマップに似て何かを実装します。
class a
{
...
MAP_BEGIN()
MAP_DECL...
MAP_END()
...
};
事があり、各MAP_DECLのために、私は2ヶ所にマクロを拡張する必要があります。
class a
{
virtual void func()
{
...
//does something with the decl declaration
}
...
//also expand some stuff here
}
ブーストプリプロセッサ(私たちが行くように同時にクラスフィールドを拡大しながら)(理論上は)私は最後に)(シーケンスにMAP_DECLを蓄積し、FUNCにそれを拡張できるようにする必要があります。
<時間>のアップデート1
私は、現時点ではブーストプリプロセッサライブラリを使用しています。私は現在、私はシーケンスに何かを追加する必要があるたびに、次のような新しいマクロ変数/定義を作成こだわってます。
私はブーストプリプロセッサシーケンスを拡大しようとしていると私は、現時点ではこれをやってこだわっている
#define SEQ (w)(x)(y)(z)
#define SEQ2 BOOST_PP_SEQ_PUSH_BACK(SEQ, a)
<時間>
のオリジナルの
私は次のコードを
を持っていると仮定#define CUR 2
#define CUR CUR + 2
私は最初の行からCURの値を使用するように2行目を強制する方法は?
解決
簡潔に、あなたではないことができます。
CURが(第2 #define
後に)拡張されるとき、プリプロセッサはCUR + 2とCURのインスタンスを置換し、「ブルー塗料」名前CUR(任意さらにそれを拡大しません)。その後、CコンパイラがCUR + 2、最も可能性の高い利回りコンパイルエラーを見ます。
他のヒント
は、あなたがそれを行うことができたとしても、それは危険だ。
例:
#define CUR 2
#define CUR CUR + 2
...
int x = CUR*4; // x = 2 + 2 * 4
あなたはそれを行うことができない、あなただけの他のコンパイラが波及するだろう、一度エラーを各マクロを#defineすることができます。
私は1つのポイント(プリプロセッサのシーケンスを高めるために追加する)に似た何かをやってみました。私は(理由ジョナサンは彼の答えに言ったの)ハードの壁にヒットし、完全に異なることをやってしまいました。
)後、私はそのブーストMPL型の配列が同じ有効制限していた(完全に理にかなっていますが、実際にそれにぶつかるまで、時にはあなたは、壁には表示されません)。
あなたはかなり全体のシーケンスを定義したり、それを別の名前を付ける必要があります。
あなたは、おそらくいくつかのメンバ変数を定義し、その関数にそれで物事を行う(登録?)されています。あなたは、コンテナ内のメッセージを保持する場合、あなたはあなたのMAP_DECLがそれにメッセージを追加作成し、その機能にだけforループを行うことができます。
#define MAP_BEGIN std::vector<Message> m_messages; \
void buildMap() {
#define MAP_END }
#define MAP_DECL(...) m_messages.push_back(...);
各メッセージが別々のタイプ、トライ型消去(任意のブースト::)、またはそれらは、一部の基本クラスとストアから継承させるのであれば。