我对宏有疑问。我怎么能通过宏将模板类强制转换为普通类。例如:
#define RUNTIME_CLASS(class_name) ((CRuntimeClass*)(&class##class_name))
template<typename T> A {};
if (RUNTIME_CLASS(A));
我知道这段代码不能编译,因为它不会看到模板位。但我不明白实际的宏。它的返回看起来像(CRuntimeClass*)(&classA)
为什么##
连接会使class + A?以及预处理器如何理解这种表示法?
答案 0 :(得分:1)
也许在你拿宏的地方,所有的类名都以“class”开头,而宏只需要名字的第二部分,即“class”之后的内容。
答案 1 :(得分:1)
我不明白这个问题。
首先 - 我不明白你为什么要将模板类强制转换为普通类。将模板类转换为具体类的方法是提供模板参数。没有这些参数,模板类尚未完全定义,因此根本无法使用。
在某种程度上,模板是在编译时计算的函数,用于定义类/函数。如果没有参数,尝试将模板视为一个类就像尝试将未评估的函数视为数字一样。
如前所述,“##”是一个标记串联预处理器运算符。如果你没想到,我不明白你为什么写“##”。
这与名称修改有关吗?
答案 2 :(得分:0)
这就是它的作用,##连接一个字符串和一个传递给#define的参数。