C ++如何创建异构容器

时间:2010-07-09 11:15:06

标签: c++ containers heterogeneous

我需要以(名称,值)的形式存储一系列数据点,其中值可以采用不同的类型。

我正在尝试为每个数据点使用类模板。然后,对于我看到的每个数据点,我想创建一个新对象并将其推回到向量中。对于每种新类型,我需要先从模板创建一个新类。但是我不能存储在任何向量中创建的对象,因为向量对于所有条目都期望相同的类型。我需要存储的类型不能安装在继承层次结构中。他们是无关的。此外,将来可能会创建更多类型,我不想为每种新类型更改存储服务。有没有办法创建异构容器来存储这些条目? 谢谢!

4 个答案:

答案 0 :(得分:9)

boost::any已经被推荐,不过它适用于任何事情,所以你不能期待它。

如果您提前了解各种类型,最好使用boost::variant

typedef boost::variant<Foo, Bar, Joe> variant_type;

struct Print: boost::static_visitor<>
{
  void operator()(Foo const& f) const { f.print(std::cout); }

  template <class T>
  void operator()(T const& t) const { std::cout << t << '\n'; }
};

void func(variant_type const& v) // not template
{
  boost::apply_visitor(Print(), v); // compile-time checking
                                    // that all types are handled
}

答案 1 :(得分:7)

升级库可能有你想要的东西(boost :: any)。如果你不能使用boost ...

,你可以使用包装指针方法自己滚动

答案 2 :(得分:4)

像这样的容器的问题是,当你想要访问容器中的某些东西时,你必须确定它的类型然后以某种方式将它强制转换为实际类型。这是丑陋,低效和容易出错的,这就是为什么C ++中的#1选择是使用继承,除非你有一个很好的理由不去 - 这是我在C ++职业生涯中从未遇到的事情。

答案 3 :(得分:0)

我在想你可以只有一个Pair(类型,void *)并编写你自己的pop函数,根据对中描述的类型转换void *然后将它们推到任何容器中捕获你的眼睛。 / p>