c++ - 如何制作一个容器来容纳任何类型的指针

标签 c++ pointers

这可能看起来很愚蠢,但我想制作一个容器来保存任何类型的指针,这样我就可以在其中存储每个指针,然后稍后轻松删除它们。我试过:

vector<void*> v;

v.push_back(new Dog());
v.push_back(new Cat());

cout <<  v[0]; // prints mem address
cout <<  v[1]; // prints another mem address
cout << *v[0]; // compiler yells at me

但显然您不能取消引用 void 指针。有没有一种方法可以制作任何类型的指针的通用容器,而不必让每个类都扩展一个名为“Object”或其他东西的父类(super class)?

最佳答案

您可以实现一个指针包装器,一个继承自公共(public)基类的模板类,并将它们放置到容器中。沿线的东西:

class pointer_wrapper_base
{
public:
  virtual void delete_pointee()=0;
protected:
  void *m_ptr;
};

template<class T>
class pointer_wrapper: public pointer_wrapper_base
{
public:
  pointer_wrapper(T *ptr_) {m_ptr=ptr_;}
  virtual void delete_pointee()
  {
    delete (T*)m_ptr;
  }
};

一旦你有了这个类,你就可以使用 poly-variant class,它类似于变体类,但所有不同的变体都有共同的基类。如果您想看一下,我这里有一个实现:http://sourceforge.net/p/spinxengine/code/HEAD/tree/sxp_src/core/utils.h (搜索 poly_pod_variant):

  std::vector<poly_pod_variant<pointer_wrapper_base> > x;
  x.push_back(pointer_wrapper<Cat>(new(Cat)));
  x[0]->delete_pointee();

或者,如果您同意包装器的动态分配,那么您当然可以将指向 pointer_wrap_base 的指针存储到 vector 中,例如

std::vector<std::unique_ptr<pointer_wrapper_base> > x;
x.push_back(std::unique_ptr<pointer_wrapper_base>(new(pointer_wrapper<Cat>)(new Cat)));
x[0]->delete_pointee();

关于c++ - 如何制作一个容器来容纳任何类型的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24582108/

相关文章:

c++ - Qt 中的 Has-a 关系和信号

C++ Mac | Conio替代品

c++ - 在家庭系统上安装 gtest 时出错

c++ - 获取指向结构的第一个元素的指针

c++ - 在堆上初始化的指针数据成员

c++ - 为什么在 `OnWorkerEvent` 中使用 `wxProgressDialog`?

c++ - pthread 将对象作为参数传递给 pthread_create

c - Strtol 未返回正确的 endptr - C

c - C 中 char *str ="this is a string"与 char *str = strdup ("this is a string"之间的区别是什么

c - const 指针和整数 const 指针有什么区别?