如何在C++容器中存储不同类型的对象?

Ram*_*sey 25 c++ polymorphism containers types

是否有一个我可以使用或构建的C++容器,可以包含,比如intstringdouble类型?我面临的问题是每当我尝试填充地图,矢量或列表时,例如,以下内容:

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++附带的标准vectorlist容器已经是通用的,因此它们无法工作 - 它们可以是任何类型的容器,但不能包含多种类型.

如果可能的话,我也想避免使用Boost - 我更喜欢它,如果有一种简单的方法我可以自己编码.

[编辑]嘿伙计,非常感谢你的建议 - 我应该解释我将如何使用这个容器,但它有点复杂,因此上面的(大)简化.我认为这里最好的选择是使用Boost.再次感谢.

Jos*_*osh 22

您可以使用(或重新实现)boost::any并存储boost::any容器中的实例.这将是最安全的,因为boost::any在一般情况下可能涉及解决此类问题所涉及的大部分边缘情况和复杂性.

如果你想做一些快速而又脏的事情,可以创建一个结构或者一个包含所有潜在类型成员的联合,以及一个枚举或其他类型在对象中"活动"的指示符.特别注意工会,因为它们有一些有趣的属性(例如,如果你读错了工会成员就调用未定义的行为,一次只能有一个成员'活动',最近被写入的那个).

不过,我很好奇你正在做什么,你需要这样一个结构.

  • 如果你不想使用Boost并且可以访问C++ 17,你可以使用`std :: any` :) (3认同)
  • 使用`boost :: any`时+1.另外,正如我在@Elalfer的评论中所说,你不能将`std :: string`存储在一个联合中. (2认同)

sbi*_*sbi 12

那么,第一个问题是:为什么你认为你需要在同一个容器中存储不同的,完全不相关的类型的对象?这对我来说似乎很可疑.

如果我有需要,我会调查boost::variantboost::any.

  • 根本不可腥.我经常编写程序,我想在键入字符串或枚举标识的地图中存储替代.我希望它们在一个结构中,所以我可以完全传递它们,我希望它们是任何类型,因为替代方法是将它们存储为字符串并每次解析它们.但是,是的,boost :: any或boost :: variant是要走的路. (4认同)
  • 我认为更好的问题是,在我快速解雇某人之前,“boost::variant 的目的是什么”。这有什么区别呢?它是抽象的,它是实用的,它就是你想要的任何东西。克服它。 (2认同)

T.E*_*.D. 6

你想要什么被称为"hetrogenious容器".在技​​术上,C++在STL中不支持它们,但Boost确实如此.

考虑到这一点,我想你会在这个问题中找到答案:你怎么做一个异构的 - boostmap


ssm*_*mir 5

您可以使用结构、类或 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)