列表(矢量)的不同结构

时间:2014-08-13 06:46:34

标签: c++ vector

是否可以使用某种不同结构的列表/数组/向量?

例如,MFC中有CObjectCArray,但没有MFC:

我可以做同样的事情

std::vector<void*> pVec;
{
  MYSTRUCT m = new MYSTRUCT;
  pArr.push_back(m);
  // looks fine here
}
//what is in my vector now?

有什么东西可以处理吗?

2 个答案:

答案 0 :(得分:4)

显而易见的首选方法是使用std::vector<Base*>来处理多态类型。

如果您确实拥有完全不相关的类型,那么boost::anyboost::variant类型的橡皮擦可能就是您要找的那样:

std::vector< boost::variant<int, std::string> > vec;
vec.push_back( 21 );
vec.push_back( "hello " );

答案 1 :(得分:2)

您提供的示例很危险。你如何清理(即delete)你分配的内容?它的类型已被分配到void *,因此编译器如何知道要调用哪个operator delete

您可以通过至少两种不同的方式安全地解决这个问题:

  • 所有对象都可以从具有virtual析构函数的公共基础继承。然后,您可以std::vector std::unique_ptr到公共基地。这具有可扩展的优点(你可以声明从公共库派生的新类型并将它们放入容器中而不修改容器),但是缺点是要求你去免费商店(为它分配内存) std::unique_ptr指向)。
  • 您可以使用boost::variant之类的变体类型。这不需要在免费商店中使用公共库或分配,但是当您声明容器时,它将要求您声明可能存储在容器中的所有类型(即,它不像以下那样容易扩展;基于继承的解决方案)。