2011-02-03 7 views
1

私は無事にこのマクロ連結し、さらに拡大

#define TEMPLATE_DECL_BEGIN_0 template < 
#define TEMPLATE_DECL_BEGIN_1 TEMPLATE_DECL_BEGIN_0 typename Arg0 
#define TEMPLATE_DECL_BEGIN_2 TEMPLATE_DECL_BEGIN_1 , typename Arg1 
#define TEMPLATE_DECL_BEGIN_3 TEMPLATE_DECL_BEGIN_2 , typename Arg2 
#define TEMPLATE_DECL(N) TEMPLATE_DECL_BEGIN_ ## N > 

TEMPLATE_DECL(0) 
TEMPLATE_DECL(1) 
TEMPLATE_DECL(2) 
TEMPLATE_DECL(3) 

は、任意の合理的に標準Cプリプロセッサの

template < > 
template < typename Arg0 > 
template < typename Arg0 , typename Arg1 > 
template < typename Arg0 , typename Arg1 , typename Arg2 > 

を生成するために期待することはできますか?

私の心配は、前交換後の連結後、マクロ展開についてです:それはそうNがによって例えば置き換えられます後、その後

TEMPLATE_DECL_BEGIN_2 

になることを

TEMPLATE_DECL_BEGIN_1 , typename Arg1 

に動作しますか?

+0

私は、複数のテンプレートパラメータリストに関してコンパイルエラーが発生すると思いますが...好奇心が強いので、プリプロセッサコードなしでテンプレート特殊化を定義することは簡単です。なぜこのアプローチをとっていますか? – AJG85

+0

私はそれがコンパイルするつもりはなかったと言いました。これは、マクロを使用する半自動カスタムRTTIに必要なスニペットです。 – valerio

答えて

3

はい。オブジェクト状及び機能のようなマクロ呼び出しの両方について

、置換リストを交換する複数のマクロ名に 再検査される前に、##前処理の各インスタンス:C99標準の6.10.3.3§3から置換リスト内のトークン (引数ではない)が削除され、前のプリプロセス処理 トークンが次の前処理トークンと連結されます。

そして6.10.3.4§3:

置換リストのすべてのパラメータの後には、置換されていると#and ## 処理が行われた、すべてのplacemarker前処理トークンが削除されます。その後、 の結果の前処理トークン列が、後続の全ての ソースファイルの前処理トークンとともに、より多くのマクロ名を置き換えるために再スキャンされます。

標準では、より多くのマクロ名を置き換える前にx ## yが発生することが保証されています。したがって、その時点でマクロ名を構成すると置き換えられます。

これはC99標準からのものですが、私はこのセクションをC89標準から変更したことは間違いありません。これはC++に実際に当てはまるバージョンになります。

+0

非常にクリア、ありがとう – valerio

関連する問題