質問

のアップデート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(...);

各メッセージが別々のタイプ、トライ型消去(任意のブースト::)、またはそれらは、一部の基本クラスとストアから継承させるのであれば。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top