-1

マクロについて質問です。マクロを介してテンプレート クラスを通常のクラスにキャストするにはどうすればよいですか。例:

#define RUNTIME_CLASS(class_name) ((CRuntimeClass*)(&class##class_name))

template<typename T> A {};

if (RUNTIME_CLASS(A));

テンプレートビットが表示されないため、このコードがコンパイルされないことはわかっています。しかし、私は実際のマクロを理解していません。それの戻りは次のようになります(CRuntimeClass*)(&classA)

##連結するとクラス + A になるのはなぜですか? そして、プリプロセッサはそのような表記をどのように理解しますか?

4

3 に答える 3

1

質問がわかりません。

まず、テンプレート クラスを通常のクラスにキャストする理由がわかりません。テンプレート クラスを具象クラスに変換する方法は、テンプレート パラメーターを指定することです。これらのパラメーターがないと、テンプレート クラスは完全に定義されていないため、使用できません。

ある意味では、テンプレートは、クラス/関数を定義するためにコンパイル時に評価される関数です。パラメータがなければ、テンプレートをクラスとして扱おうとすることは、未評価の関数を数値として扱おうとするようなものです。

すでに述べたように、「##」はトークン連結プリプロセッサ演算子です。それを期待していないのなら、なぜ「##」と書いているのか理解できません。

これは名前マングリングと関係がありますか?

于 2009-09-30T11:22:24.693 に答える
1

おそらく、マクロを使用した場所では、すべてのクラス名が「class」で始まり、マクロは名前の 2 番目の部分 (「class」の後に続く部分) のみを想定しています。

于 2009-09-30T10:52:03.257 に答える
0

## は文字列と #define に渡されたパラメーターを連結します。

于 2009-09-30T10:50:51.650 に答える