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

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

有帮助吗?

解决方案

Boost库可能是您在寻找的(提升::任何)。如果您不能使用Boost ...

,您可以使用包裹的指针方法滚动自己

其他提示

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
}
.

包含这样的问题是,当您想要在容器中访问内容时,您必须确定其类型,然后以某种方式将其投入到实际类型。这是丑陋的,低效和容易出错的是,这就是为什么在C ++中的#1选择是使用继承,除非你有一个非常好的理由而不是 - 我在C ++职业生涯中从未遇到过的东西。

我在认为你可以拥有一对(类型,void *)并写出自己的POP功能,这取决于对对中描述的类型,然后将这些装载到任何容器捕获您的眼中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top