【问题标题】:List functionality c++列表功能 C++
【发布时间】:2013-12-05 22:14:51
【问题描述】:

我浏览过各种 c++ 网站和教科书。但他们都没有与我正在寻找的东西有关的任何东西。

我想要的是一个 c++ 列表,其中可以包含 int、string 和 int 数组变量。但是在我花几个小时玩一些代码之前,我想知道是否有人知道这样的事情是否真的存在?我不是要求向我展示代码,如果可能的话,我会尝试它,然后询问我遇到的任何问题。

谢谢

【问题讨论】:

标签: c++ arrays string list int


【解决方案1】:

您最好的选择是boost::variant。记住 - 我没有告诉你这很容易。

使用会很简单:

typedef boost::variant<...my necessary types...> MyVariant;

std::list<MyVariant> myList;

【讨论】:

  • 这可能并不容易,但会令人欣慰。
  • 谢谢会试一试
  • @user3001499,如果建议的解决方案适合您,请考虑接受此答案。
【解决方案2】:

如果您的意思是一个对象可以包含 int、字符串和数组作为单独的对象,而不是作为一个对象(如联合)——我认为您应该看看 C++11 tuples ,并在列表中使用它们。

【讨论】:

  • 元组列表不是不同类型对象的列表...std::tuple&lt;int, std::string&gt;例如包含一个 int 和一个字符串,而不是一个 int 或一个字符串。
  • 在列表中,还是在列表中?
  • @Johan,是的,是 AND,问题是关于使用 int、字符串 AND 数组。如果问题的作者的意思是 OR,那么元组当然不是答案
  • @Apokal 您能否在回答中澄清这一点,以便我删除我的反对票?
  • @Johan,谢谢你们的cmets,现在答案更清楚了。
【解决方案3】:

将不同类型的对象/数据放在一个列表中可能是不安全的。

但如果是要求,那么为什么不从 std::list 派生新类,并结合使用上述答案中提到的方法跟踪插入到列表中的类型。

【讨论】:

  • 我犹豫要否决一个新人,所以请删除这个答案并在我之后重复:不要从 STL 容器派生!不要从 STL 容器派生!不要从 STL 容器派生!。 (长)理由是:1. 在可行的情况下,您应该支持组合而不是继承,2. 从没有virtual 方法的类继承没有(功能)好处,3. 从没有virtual 的类继承析构函数和公共复制/移动构造函数是灾难(截断)的秘诀。
【解决方案4】:

您还可以使用联合或空指针创建结构。

enum varType
{
    vt_int,
    vt_float,
    vt_string
}

class myVariant
{
private:
    void* mVariable;
    varType mType;
};

或者,

class myVariant2
{
private:
    union
    {
        float fValue;
        int iValue;
        std::string* sValue;        
    };
    varType mType;
}

这不太好,需要大量转换,但如果您不喜欢使用其他库来完成这么小的任务,这可能会有所帮助。

Edit1:您将需要 getStringValue、getFloatValue 和 getIntValue 函数。

Edit2:您可以在 std::list 中安全地使用这些类。

Edit3:你需要自己调用 std::string 的析构函数(如果变量是字符串)。

【讨论】:

  • 包含非 pod 成员的联合仅从 c++11 开始可用。
  • @StoryTeller: 它们很重要(你需要自己调用析构函数)
  • 那么联合应该包含 std::string* 或者更糟的是 char*。所以我想使用 void* 是一个更好的主意,而且更灵活。
  • @revani,什么!?不!这就是 C++ 的世界。还有更好的选择。看看 boost::any 或 boost::variant。
  • @revani,这就是我们不能拥有美好事物的原因:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
  • 2018-06-29
相关资源
最近更新 更多