C ++ cast void指向模板类的指针

时间:2015-01-18 22:33:24

标签: c++ templates casting

template <typename Type> struct testClass{
    Type value;
};

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

    return 0;
}

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

我试过了:

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

但错误表明它在&#39;&gt;&#39;之前缺少模板参数。我不确定如何将它强制转换为testClass(int)

3 个答案:

答案 0 :(得分:4)

尽管事实上根本没有必要使用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

答案 1 :(得分:1)

如果您使用的是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;
}

答案 2 :(得分:1)

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

在您的情况下,此类型为testClass<int>,因此new testClass<int>会返回testClass<int> *

如果要使用void指针,可以使用static_cast<testClass<int> *>检索类型信息。

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

关于(void)指针的使用的一些评论。

  1. 你根本不需要指针。 (您的代码会泄漏内存,因为通过新创建/分配的对象需要通过delete释放/销毁。)
  2. 您可以在堆栈上创建具有自动存储持续时间的对象,并在当前范围/函数结束时销毁。

    testClass<int> obj;
    obj.value = 0;
    
    1. 您不需要void指针(如果您因任何原因需要动态分配)。
    2. 您可以使用正确的类型。

      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. 你可以使用智能指针代替真正的指针来处理破坏。
      2. 一个例子是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;
        }