如何在C ++中将模板类ptr转换为普通类ptr

时间:2009-09-30 10:21:30

标签: c++ templates concatenation c-preprocessor

我对宏有疑问。我怎么能通过宏将模板类强制转换为普通类。例如:

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

template<typename T> A {};

if (RUNTIME_CLASS(A));

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

为什么##连接会使class + A?以及预处理器如何理解这种表示法?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我不明白这个问题。

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

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

如前所述,“##”是一个标记串联预处理器运算符。如果你没想到,我不明白你为什么写“##”。

这与名称修改有关吗?

答案 2 :(得分:0)

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