【问题标题】:Serialize a STL containers of arbitrary type (including other containers) C++序列化任意类型的 STL 容器(包括其他容器) C++
【发布时间】:2016-12-18 22:30:02
【问题描述】:

首先让我说我不能使用 boost,因为这应该是练习。或者是惩罚。现在不太确定。

我必须编写一个看起来像这样的函数:

template <class T1, class T2>
void serialize<T1, T2>(std::map<T1, T2> in, std::vector<uint8_t>* buf);

然后我会遍历地图,序列化每个条目中的每一对元素。但是,我遇到了一个问题。

我现在遇到的问题是,T1 可能是一个 std::vector,其中填充了其他 std::vector。我有另一个看起来类似于上面的函数,并假设它可以正常工作,如下所示:

template <class T1>
void serialize<T1>(std::vector<T1> in, std::vector<uint8_t>* buf);

这会与上面的函数有相同的问题。我应该放弃这个并采用不同的方法吗?或者这仍然可行吗?我只是错过了什么吗?

【问题讨论】:

  • 你考虑过反序列化吗?给定输入缓冲区,你怎么知道那里序列化了什么?
  • 这实际上既不是这里也不是那里,但我想只是在读取开始的缓冲区中有一个标志......比如 1、2、3、4 等。
  • 它是这里。序列化很简单:编译器知道您正在序列化的类型,不需要 RTTI(除非您决定“隐藏”它们并序列化虚拟基类)。但是,您计划洒入的那些旗帜?...那些是 RTTI 性质的!由于它们是 Runtime 类型信息,因此模板不会像您想象的那样帮助您。在做出决定之前,请认真考虑一下您在这两个方面的需求细节。
  • 我不太明白你的意思。我原本打算只有一个序列化方法。我也对这里的斜体字的含义感到困惑。
  • Google“编译时多态性”(又名“模板和模板专业化”)——Java 内置了运行时类型信息,C++ 在这方面是纳粹分子。在 Java 中,您可以拥有 Map&lt;Object,...&gt; 并在同一个映射中拥有一个 ArrayList 作为键和另一个 String 键。在 C++ 中,map&lt;T1, ...&gt; 将只接受 T1-s 作为键(也可以在谷歌“对象切片”...作为键?”)

标签: c++ serialization stl


【解决方案1】:

如果你必须知道元素是不是向量,还是向量的向量等,使用模板不是正确的解决方案。

您应该只创建一个具有联合的对象:

bool isVector;
union
{
    vector<T> v;
    T t;
}

用这样的对象制作地图的关键。或者如果有更多可能性,请使用枚举。

对于它包含的任何类型,模板在编译时都应该具有相同的行为。在您的情况下,对象的类型只会在运行时知道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多