是否可以使用某种不同结构的列表/数组/向量?
例如,MFC
中有CObject
和CArray
,但没有MFC:
我可以做同样的事情
std::vector<void*> pVec;
{
MYSTRUCT m = new MYSTRUCT;
pArr.push_back(m);
// looks fine here
}
//what is in my vector now?
有什么东西可以处理吗?
答案 0 :(得分:4)
显而易见的首选方法是使用std::vector<Base*>
来处理多态类型。
如果您确实拥有完全不相关的类型,那么boost::any
或boost::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
之类的变体类型。这不需要在免费商店中使用公共库或分配,但是当您声明容器时,它将要求您声明可能存储在容器中的所有类型(即,它不像以下那样容易扩展;基于继承的解决方案)。