gpt4 book ai didi

C++如何创建异构容器

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:03:52 27 4
gpt4 key购买 nike

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

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

最佳答案

C++17 及更高版本。

std::any 允许保存任何类型,尽管它需要知道存储的类型才能检索它。

但是,如果您有一组已知类型,您可能更喜欢 std::variant:

using variant_type = std::variant<Foo, Bar, Joe>;

int func(variant_type const& v) // not template
{
auto const visitor = [](auto const& t)
{
if constexpr (std::is_same_v<Foo const&, decltype(t)>)
{
return t.fooish();
}
else
{
return t.barjoeish();
}
};

return std::visit(visitor, v);
}

快速定义访问者的有用技巧:

template <typename... Ts> struct overload : Ts...
{
overload(Ts... aFns) : Ts(aFns)... {}
using Ts::operator()...;
};
template <typename... Ts> overload(Ts...) -> overload<Ts...>;

// Used as
auto const visitor = overload(
[](Foo const& foo) { return foo.fooish(); },
[](auto const& other) { return other.joebarish(); }
);

return std::visit(visitor, variant);

C++17 之前的版本。

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++如何创建异构容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3212058/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com