2011-01-18 30 views
4

私はいくつかのテンプレートメタプログラミングを行っています。主に自分のコンパイル時のリストを書いていますが、できるだけ簡単にするために使いたいプリプロセッサの魔法もあります。再利用可能なプリプロセッサ__COUNTER__

私がしようとしているのは、ファンクタのコンパイル時のリストを作成することです。その部分は実行されますが、作成を容易にするマクロ(およびリストに追加するマクロ)はありません。

簡単な例:私はPP_DEC用プリプロセッサマクロ、すなわちの大規模なセットを作成しているので、今

template<typename Functor, typename Tail> 
struct node { 
    typedef Functor head; 
    typedef Tail tail; 
}; 


template <typename Functor, typename Tail> 
struct push_back { 
    typedef node<Functor, Tail> list; 
}; 

struct unit0 {}; 

#define AUTO_FUNCTION(name) struct test_functor_##name {   \ 
    static void run_test();           \ 
};                 \ 
typedef push_back<             \ 
      test_functor_##name,         \ 
      CONCAT(unit, PP_DEC(__COUNTER__))      \ 
     >::list CONCAT(unit, __COUNTER__);       \ 
void test_functor_##name::run_test() 


AUTO_FUNCTION(hello) { 
    ... 
} 

が、これは動作します:私は本当に避けたい部分です

#define PP_DEC(x) PP_DEC_I(x) 
#define PP_DEC_I(x) PP_DEC_ ## x 
#define PP_DEC_1 0 
#define PP_DEC_2 1 
... 
#define PP_DEC_N N 

私がこの質問をしている理由です。誰もがその価値を増大させることなく、私はCOUNTERを使用することができる方法についての提案を持っているか、私はに似計数パターンを達成することができますいくつかの他の方法で行いますなど一backの意味を、変更

0 1 
1 2 
2 3 
... 

提案がですコースも歓迎:)。

PS。これは生産のためのものではなく、楽しみのためのものです。したがって、GCC固有の拡張は歓迎されます。

PPS。私は、私がやっていること全て(このプロジェクトの全体)を理解したいので、ブーストのような外部の依存関係を避けようとしています。

+0

'__COUNTER__'は、Microsoftの言語拡張ではなく、標準C++ –

+0

@Alf P.シュタインバッハである - 私は知っています。 GCC 4.3には存在していますが、これはコンパイラ固有の拡張機能を使用しても構わないので(愉快なものだからです)、 '__COUNTER__'が使われました。 '__COUNTER__'を使わずに同様のことを実現する他の提案は、もちろん歓迎します。 – Mic

+0

私は同様の問題を抱えています。これを解決できましたか?ありがとう。 =) –

答えて

9

あなたは余分なマクロを使用して__COUNTER__値を "修正" することができます

#define MY_MACRO MY_MACRO_COUNTED(__COUNTER__) 

#define MY_MACRO_COUNTED(counter) counter + counter 
関連する問題