1
2
我同意合法化。我需要做的几乎和你做的完全一样,看看超载
我的解决方案(只需要在一台机器上临时序列化数据,因此不需要处理endianness)基于以下模式:
然后进一步重载任何非pod类型(例如字符串)的read_raw/write_raw。注意,只有read_raw的第一个版本需要重载;如果 use ADL correctly ,第二个(1-arg)版本可以调用稍后和其他命名空间中定义的2-arg重载。 编写示例:
阅读示例:
它不像重载操作符那么性感,而且事情也不像一行那么容易(无论如何我都倾向于避免,因为调试断点是面向行的),但是我认为它变得更简单,更明显,也不太冗长。 |
2
1
据我所知,用于指定类型的流属性更适合于指定endian ness、packing或其他“元数据”值。类型本身的处理应该由编译器完成。至少,这是stl的设计方式。 如果使用重载自动分隔类型,则仅当类型与声明的变量类型不同时,才需要指定该类型:
读取声明类型以外的类型会更混乱。不过,一般来说,我认为应该避免读取或写入不同于输出类型的变量。 我相信std::codecvt的默认版本什么也不做,返回“noconv”表示所有内容。它只有在使用“宽”字符流时才真正起作用。你不能为codecvt设置一个类似的定义吗?如果出于某种原因,为流定义一个no-op codecvt是不切实际的,那么我认为您的转换解决方案没有任何问题,特别是因为它被隔离到一个位置。 最后,您确定使用一些标准的序列化代码不会更好,比如 Boost 而不是自己滚? |
3
0
我们需要做一些类似于你所做的事情,但我们遵循了另一条道路。我对你如何定义你的界面感兴趣。我不知道你怎么处理的一部分是 操纵器 您已经定义了(binary::u32le,binaryu16le)。 对于基本的_流,操纵器控制如何读取/写入以下所有元素,但在您的情况下,这可能没有意义,因为大小(操纵器信息的一部分)受传入和传出的变量的影响。
在上面的代码中,确定
大小似乎不属于(在我看来)操纵者。 正如我们注意到的那样,因为我们有其他约束作为类型的运行时定义,我们最终建立了自己的元类型系统来在运行时构建类型(一种变体),然后我们最终实现了那些类型(Boost样式)的去序列化,因此我们的序列化器不适用于基本的C++类型,而不是序列化/数据对。 |
4
0
我不会使用operator<<因为它与格式化文本I/O的关联太密切。 实际上,我根本不会使用运算符重载来实现这一点。我会找到另一个成语。 |