【发布时间】:2015-07-05 14:23:53
【问题描述】:
对于客户端和服务器之间交换的 UDP 包,我想支持两种字符串字段:
- 以空结尾的 c 字符串命名为
cstring - 字符串前面有
uint8_t大小字段名为vstring
为了自我记录我们包的布局,我想使用简单的结构声明:
struct ABC {
vstring a;
cstring b;
}
并在反序列化函数中调用重载函数get(char*, vstring& v) 和get(char*, cstring&),如下所示:
void deserialize(const char* bytes, ABC& msg) {
get(msg.a);
get(msg.b);
}
void serialize(char* bytes, const ABC& msg) {
put(msg.a);
put(msg.b);
}
但是,对于用户 vstring 和 cstring 来说,理想情况下应该像正常的 std::string 一样工作。
我的第一个想法是简单地将std::string 设为vstring 和cstring 的公共基础,以便在重载解析期间可以区分这两个类,但对用户而言行为相同。但由于不鼓励从std::string 派生,我不确定该怎么做。
【问题讨论】:
-
我不太明白你为什么需要新类型?为什么
string不好?它公开了const char*并具有size()方法,因此您似乎在复制功能。你能澄清一下吗?这有点像 XY 问题。 -
交易是你必须序列化
vstring和cstring因为通过网络发送对象并不总是有效。 -
从技术上讲,在我的
serialize()和deserialize()函数中,我只需要vstring和cstring是不同的类型。对于struct ABC的用户来说没关系。 -
为什么不使用合成?
标签: c++ c++11 inheritance stdstring