【问题标题】:C++ casting void pointer to template classC++ 将 void 指针转换为模板类
【发布时间】:2015-03-16 22:12:22
【问题描述】:
template <typename Type> struct testClass{
    Type value;
};

int main(){
    void* ptr = new testClass<int>;
    ptr->value = 0;

    return 0;
}

这不起作用,因为 void 指针不知道它指向什么类型,所以我必须将它转换为正确的数据类型。但是,我不确定如何为模板类执行此操作。

我试过了:

(ptr<testClass>)->value = 0;

但错误表明它在“>”之前缺少模板参数。我不确定如何将其转换为 testClass(int)

【问题讨论】:

  • static_cast&lt;testClass&lt;int&gt;*&gt;(ptr)-&gt;value = 0; 完全避免 void 指针和强制转换...void avoid
  • void 指针的原因是因为我正在尝试构建一个多类型链表,并且当指针遍历链表时,它们可能指向具有不同类型“值”的类,所以我不能真正指定指针类型

标签: c++ templates casting


【解决方案1】:

尽管实际上没有必要首先使用newvoid-指针:void* 指向-好吧-void。当用新分配的对象地址初始化指针时,类型信息会丢失。演员可以检索它:

static_cast<testClass<int>*>(ptr)->value = 0;

但是,我觉得有必要再次声明您不需要void 指针。如果需要动态分配存储,请使用指针的确切类型:

testClass<int>* ptr = new testClass<int>;

或者让编译器使用auto 为你推导出来。

auto ptr = new testClass<int>; // ptr has type testClass<int>*

并考虑使用智能指针,例如unique_ptr.

【讨论】:

    【解决方案2】:

    new 运算符为给定类型 T 分配内存,并将 T * 类型的指针返回到该类型。

    在您的情况下,此类型为 testClass&lt;int&gt;,因此 new testClass&lt;int&gt; 返回 testClass&lt;int&gt; *

    如果您想使用 void 指针,您可以使用 static_cast&lt;testClass&lt;int&gt; *&gt; 检索类型信息。

    static_cast<testClass<int> *>(ptr)->value = 0;
    

    关于(void)指针使用的一些说明。

    1. 这里根本不需要指针。 (您的代码会泄漏内存,因为通过 new 创建/分配的对象需要通过 delete 释放/销毁。)

    您可以在堆栈上创建具有自动存储持续时间并在当前作用域/函数结束时销毁的对象。

    testClass<int> obj;
    obj.value = 0;
    
    1. 这里不需要void 指针(如果出于某种原因需要动态分配)。

    您可以改用正确的类型。

    testClass<int> * ptr = new testClass<int>;
    ptr->value = 0;
    delete ptr;
    

    或使用 C++11

    auto ptr = new testClass<int>; // where type of ptr is testClass<int>*
    ptr->value = 0;
    delete ptr;
    
    1. 您可以使用智能指针代替真正的指针来为您处理破坏。

    一个例子是std::unique_ptr 处理唯一所有权。

    #include <memory>
    template <typename Type> 
    struct testClass{
      Type value;
    };
    
    int main ()
    {
      std::unique_ptr<Foo> p1(new testClass<int>);
      p1->value = 0;
      return 0;
    }
    

    【讨论】:

      【解决方案3】:

      如果你使用的是 C++11,你可以使用auto

      int main(){
          auto ptr = new testClass<int>;
          ptr->value = 0;
      
          return 0;
      }
      

      如果您使用的是旧版编译器,您可以使用:

      int main(){
          testClass<int>* ptr = new testClass<int>;
          ptr->value = 0;
      
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2021-09-20
        • 2012-11-21
        • 1970-01-01
        • 1970-01-01
        • 2016-01-12
        • 2017-10-07
        • 2011-07-31
        • 1970-01-01
        相关资源
        最近更新 更多