如何在 C++ 中实现基于行的可变长度存储?

问题描述 投票:0回答:1

我正在尝试用 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++ templates tuples c++17
1个回答
0
投票

你无法使用C++语法来描述这样的结构。一旦程序被编译,C++ 中的类型定义就会设置相关对象的存储表示形式。

这并不意味着这是不可能的。您有两个选择:

a) 使用多态性创建动态结构。请参阅适配器、代理、享元模式。

b)如果您确实需要内存中的连续数据结构(流),那么创建自己的内存池或 protobuf 库将面临一条漫长而棘手的道路。您可以使用现有的其中之一吗?

© www.soinside.com 2019 - 2024. All rights reserved.