Ram*_*sey 25 c++ polymorphism containers types
是否有一个我可以使用或构建的C++容器,可以包含,比如int和string和double类型?我面临的问题是每当我尝试填充地图,矢量或列表时,例如,以下内容:
int x;
string y;
double z;
Run Code Online (Sandbox Code Playgroud)
我受限于以下格式:
list<int> mycountainer;
vector<string> mycontainer;
Run Code Online (Sandbox Code Playgroud)
哪种力量mycontainer只包含一种类型.
在任何人提出泛型之前,由于C++附带的标准vector和list容器已经是通用的,因此它们无法工作 - 它们可以是任何类型的容器,但不能包含多种类型.
如果可能的话,我也想避免使用Boost - 我更喜欢它,如果有一种简单的方法我可以自己编码.
[编辑]嘿伙计,非常感谢你的建议 - 我应该解释我将如何使用这个容器,但它有点复杂,因此上面的(大)简化.我认为这里最好的选择是使用Boost.再次感谢.
Jos*_*osh 22
您可以使用(或重新实现)boost::any并存储boost::any容器中的实例.这将是最安全的,因为boost::any在一般情况下可能涉及解决此类问题所涉及的大部分边缘情况和复杂性.
如果你想做一些快速而又脏的事情,可以创建一个结构或者一个包含所有潜在类型成员的联合,以及一个枚举或其他类型在对象中"活动"的指示符.特别注意工会,因为它们有一些有趣的属性(例如,如果你读错了工会成员就调用未定义的行为,一次只能有一个成员'活动',最近被写入的那个).
不过,我很好奇你正在做什么,你需要这样一个结构.
sbi*_*sbi 12
那么,第一个问题是:为什么你认为你需要在同一个容器中存储不同的,完全不相关的类型的对象?这对我来说似乎很可疑.
如果我有需要,我会调查boost::variant或boost::any.
你想要什么被称为"hetrogenious容器".在技术上,C++在STL中不支持它们,但Boost确实如此.
考虑到这一点,我想你会在这个问题中找到答案:你怎么做一个异构的 - boostmap
您可以使用结构、类或 std::pair。
[编辑]
对于类和结构:
struct XYZ {
int x;
string y;
double z;
};
std::vector<XYZ> container;
XYZ el;
el.x = 10;
el.y = "asd";
el.z = 1.123;
container.push_back(el);
Run Code Online (Sandbox Code Playgroud)
对于 std::pair:
#include <pair>
typedef std::pair<int, std::pair<string, double> > XYZ;
std::vector<XYZ> container;
container.push_back(std::make_pair(10, std::make_pair("asd", 1111.222)));
Run Code Online (Sandbox Code Playgroud)