-1

我对宏有疑问。我如何通过宏将模板类转换为普通类。例如:

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

template<typename T> A {};

if (RUNTIME_CLASS(A));

我知道这段代码不会编译,因为它看不到模板位。但我不明白实际的宏。它的回归看起来像(CRuntimeClass*)(&classA)

为什么##连接会产生 class + A ?以及预处理器如何理解这种符号?

4

3 回答 3

1

也许在您使用宏的地方,所有类名都以“class”开头,而宏只需要名称的第二部分,即“class”之后的内容。

于 2009-09-30T10:52:03.257 回答
1

我不明白这个问题。

首先 - 我不明白您为什么要将模板类转换为普通类。将模板类转换为具体类的方法是提供模板参数。如果没有这些参数,模板类就没有完全定义,因此根本无法使用。

在某种程度上,模板是在编译时评估以定义类/函数的函数。如果没有参数,试图将模板视为一个类就像试图将一个未计算的函数视为一个数字。

如前所述,“##”是一个标记连接预处理器运算符。如果您没有预料到,我不明白您为什么要写“##”。

这与名称修改有关吗?

于 2009-09-30T11:22:24.693 回答
0

这就是它的作用,## 连接一个字符串和一个传递给你的#define 的参数。

于 2009-09-30T10:50:51.650 回答