我正在尝试用 C++ 实现一个基于行的可变长度存储系统。这个想法是,这个存储系统中的每一行应该能够保存不同长度和不同类型的数据。例如,第一行可以是 [1, 8.6, "hello"],第二行可以是 [2, 9.6]。
为了实现这一目标,我最初计划对每行使用带有可变参数模板的元组。每行将存储为
std::tuple<Types...>
,整个存储将表示为 std::vector<std::tuple<Types...>>
。
但是,我面临的问题是,当我尝试声明一个 Map 类来保存此存储时,我需要显式声明其参数类型 - 例如,
Map<int, double, std::string>
。这种方法限制我将不同长度和类型的记录插入到同一个 Map 实例中。
这是一个简化的片段来证明我的观点:
template <typename... Types>
class Tuple {
private:
std::tuple<Types...> data;
public:
Tuple() : data() {}
Tuple(Types &&... args) : data(std::forward<Types>(args)...) {}
}
template <typename... Types>
class Map {
private:
vector<Tuple<Types...>> record;
public:
void addRow(Types &&... args) {
record.emplace_back(std::forward<Types>(args)...);
}
};
有没有办法创建一个 Map 类,其中每行可以保存不同长度和类型的数据?我如何在 C++ 中实现这个?
你无法使用C++语法来描述这样的结构。一旦程序被编译,C++ 中的类型定义就会设置相关对象的存储表示形式。
这并不意味着这是不可能的。您有两个选择:
a) 使用多态性创建动态结构。请参阅适配器、代理、享元模式。
b)如果您确实需要内存中的连续数据结构(流),那么创建自己的内存池或 protobuf 库将面临一条漫长而棘手的道路。您可以使用现有的其中之一吗?