传统上如何在C ++中实现多类型容器(数组/向量/列表)? (当然没有元组)

时间:2014-12-11 06:57:04

标签: c++ arrays boost tuples

我很想知道如何在C ++中实现多类型容器,例如Array或Vector或List?我的意思是将整数,字符串和/或向量/数组放在一个数组/向量中。

你可能会问我需要这种用法的情况是什么?

我的回答:假设我有一个XML,其中包含有关此类学生的信息:

<school tag='town'>
 <student>
      <name>Robert Largen</name>
      <number>87854788</number>
 </student>
 <student>
      <name>Robert Largen</name>
      <number>87854788</number>
 </student>
 <student>
      <name>Robert Largen</name>
      <number>87854788</number>
 </student>
</school>

我处理XML,好吧,我把数字作为一个字符序列,但是我想在检索后立即将整数作为它们的类型转换并将它们放入一个我不知道的多类型容器中如何完成呢。以上不是现有项目的真实案例。

问题:我想知道传统上用C ++解决这样的问题怎么样? Boost是否已成为超级标准?或者带有tuple的c ++真的拯救了C ++程序员的世界?我真的很困惑。

3 个答案:

答案 0 :(得分:2)

如果“multy-type container”是指包含一组不同类型的容器,那么它可以通过多种方式实现。例如,您可以使用boost::variant s(具有访问者模式)或boost::any的容器,或者使用公共基本接口创建多态容器。这实际上取决于如何使用这个容器。

如果您的意思是:一个对象包含一组特定类型的子对象(如stundent那里),那么您只需使用POD或struct / class即可。

答案 1 :(得分:2)

对于这个特殊情况,你只需要一个

struct student
{
    std::string name;
    unsigned long number;
};

struct school
{
    std::string tag;
    std::vector<student> students;
};

最后一个包装类包装所有这些都提供了适当的存取器和操纵器。

在修复XML结构的地方都是如此。

如果您想阅读通用XML(其中标签,属性和值可以是任何东西),您可以将简单的XML树表示为

struct node
{
    std::string tagname;
    std::map<std::string,std::string> properties;
    std::string value;
    std::vector<node> children;
};

一切都只是......文字。

还有很多其他的方法,但是 - 这给了你给出的例子 - 风险太大。

答案 2 :(得分:1)

如果你要求替换元组,你可以选择结构。 E.g:

struct Student{
     int id;
     string name;
};

除了一些模板元编程,我不知道任何上下文,你不能使用结构代替元组。唯一的缺点是,您必须预先定义结构,而元组(其成员)通常是在变量或参数定义的站点上临时定义的(两者都必须在编译时发生)。