2009-09-30 29 views
-1

我对宏有疑问。我怎么能通过宏模板类投射到普通类。例如:如何将模板类ptr转换为C++中的普通类ptr

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

template<typename T> A {}; 

if (RUNTIME_CLASS(A)); 

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

为什么## concatenate使class + A?以及预处理器如何理解这种符号?

+2

##是预处理器的一个有用的功能。它允许通过串联创建令牌。 – 2009-09-30 10:46:30

+2

我不明白你想要做什么。 这个班级是否是模板有什么不同? 它也看起来像你想要*类型*(A)并将其转换为指针。你不能。类型不是值。你是否想将'A *'类型的*对象*转换为'CRuntimeClass *'?你怎么知道把它转换成'CRuntimeClass *'是安全的? 请解释你正在尝试解决什么问题。那么我们可以告诉你,如果这是可能的,你应该怎么做。 – jalf 2009-09-30 11:05:46

回答

1

也许你在哪里使用宏,所有的类名都以“class”开头,宏只需要名称的第二部分,“class”后面是什么。

0

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

1

我不明白这个问题。

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

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

如前所述,“##”是一个令牌串联预处理器运算符。如果你不期待,我不明白你为什么写“##”。

这是关于名称混搭吗?