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