0

アップデート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    
}

Boostプリプロセッサは、(理論的には)MAP_DECLをシーケンスに蓄積し、最後にそれをfunc()に展開できるようにする必要があります(同時にクラスフィールドを展開します)。


アップデート1

現在、Boostプリプロセッサライブラリを使用しています。私は現在、シーケンスに何かを追加する必要があるたびに、次のような新しいマクロ変数/定義を作成するのに行き詰まっています。

Boost Preprocessorシーケンスを拡張しようとしていますが、現時点ではこれを実行できません。

#define SEQ (w)(x)(y)(z) 
#define SEQ2 BOOST_PP_SEQ_PUSH_BACK(SEQ, a)

オリジナル

次のコードがあるとします

#define CUR 2
#define CUR CUR + 2

2行目に1行目のCURの値を使用させるにはどうすればよいですか?

4

4 に答える 4

5

簡潔に言えば、できません。

CURが展開されるとき(2番目以降#define)、プリプロセッサはCURのインスタンスをCUR + 2に置き換え、「青いペイント」という名前をCURに置き換えます(これ以上展開しません)。その後、CコンパイラはCUR + 2を認識します。これにより、コンパイルエラーが発生する可能性があります。

于 2009-09-06T05:39:53.633 に答える
3

それができたとしても危険です。
例:

#define CUR 2
#define CUR CUR + 2
...
int x = CUR*4; // x = 2 + 2 * 4
于 2009-09-06T05:41:01.010 に答える
2

それはできません。各マクロを#defineできるのは1回だけです。そうしないと、コンパイラーがエラーをスピルします。

于 2009-09-06T05:40:33.520 に答える
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(...);

各メッセージが別々のタイプである場合は、タイプ消去(boost :: any)を試すか、基本クラスから継承して保存します。

于 2009-09-06T07:23:56.277 に答える