gpt4 book ai didi

c++ - 各种类型的容器 - C++

转载 作者:行者123 更新时间:2023-11-30 01:49:57 24 4
gpt4 key购买 nike

所以我尝试在 C++ 中创建一个“表”类,其结构如下:

表.h

class Table
{
private:
class TableImpl;
TableImpl* impl;
};

表格.cpp

class Table::TableImpl
{
private:
class Row
{
private:
template <typename T>
class RowDataCell
{
T data;
}
std::vector<RowDataCell*> data;
};
std::vector<Row*> rows;
};

TableImplRow 对象的 std::vector 组成,每个 Row 对象由通用 RowDataCell 对象的 std::vector。唯一的问题是,我无法创建 std::vector,因为我需要为 RowDataCell* 提供模板参数,这将阻碍我拥有一个容器的目标杂项。

有没有一种方法可以使用标准 C++ 来实现这个目标。

最佳答案

有两种合理的方法。

第一个是判别 union ,另一个是旧 C 风格的类型安全变体 void* “任何东西都可以在这里”。

我先提两个boost它们的实现:

boost::variant<A,B,C> (和传入的 std::experimental::variant )是一个有区别的联盟。它可以存储一个 A 类型的东西, BC .有多种类型安全的方法可以取出元素,或通过“访问”对它们执行操作。 Variant 对其可以容纳的类型有一些限制,还有更多限制取决于您如何注入(inject)这些类型。

boost::any (和传入的 std::experimental::any )是类型安全的 void*具有值(value)语义。几乎任何东西都可以存储在其中(any 要求您的对象是 CopyConstructable),但只有当您知道其中存储的东西的确切类型并请求它时,您才能访问它。

自己编写任何一个都是可行的,但我建议使用它们,或者至少理解它们并克隆它们的大部分界面和模式。

variant可以在自身内部“内部”存储实例,这通常是一种更好的方法。您可以使用 union 来模拟它,类型列表,以及该列表的索引,以及一堆元编程样板。顺便说一句,对齐问题很棘手。

any更容易写,但仍然有点挑战。它是一个真正的基本类型删除对象,只有一个“强制转换为 X 类型”(通过 typeid 或等效项)和暴露的拷贝。如果你见过std::function得到实现,你就成功了一半。

关于c++ - 各种类型的容器 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28179376/

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