【问题标题】:How to cast template class ptr to normal class ptr in C++如何在 C++ 中将模板类 ptr 转换为普通类 ptr
【发布时间】:2010-12-02 14:31:26
【问题描述】:

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

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

template<typename T> A {};

if (RUNTIME_CLASS(A));

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

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

【问题讨论】:

  • ## 是预处理器的一个有用功能。它允许通过连接创建令牌。
  • 我不明白你在做什么。类是否是模板有什么区别?看起来您还想采用 type (A) 并将其转换为指针。你不能。类型不是值。是否要将A* 类型的object 强制转换为CRuntimeClass*?你怎么知道将它转换为CRuntimeClass* 是安全的?请说明您要解决的问题。然后我们可以告诉你是否可行,以及你应该如何去做。

标签: c++ templates concatenation c-preprocessor


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我不明白这个问题。

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

      从某种意义上说,模板是在编译时进行评估以定义类/函数的函数。如果没有参数,尝试将模板视为类就像尝试将未计算的函数视为数字一样。

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

      这和名字修改有关吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-10
        • 1970-01-01
        • 1970-01-01
        • 2012-09-12
        • 2018-12-24
        • 1970-01-01
        • 2021-08-07
        相关资源
        最近更新 更多