Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多次访问相同的数据类型_C++_Boost - Fatal编程技术网

C++ 多次访问相同的数据类型

C++ 多次访问相同的数据类型,c++,boost,C++,Boost,我尝试从协议中实现一个数据结构。为了确保有效负载类型适合所包含的数据,我有一个visitor函数来获取该类型。在所有其他数据结构中,变量中使用了不同的类型,这里的有效负载除外 enum class PayloadType : uint8_t { Unsecured = 0, Signed = 1, Encrypted = 2, Signed_External = 3, Signed_And_Encrypted = 4 }; typedef ByteBuf

我尝试从协议中实现一个数据结构。为了确保有效负载类型适合所包含的数据,我有一个visitor函数来获取该类型。在所有其他数据结构中,变量中使用了不同的类型,这里的有效负载除外

enum class PayloadType : uint8_t {
    Unsecured = 0,
    Signed = 1,
    Encrypted = 2,
    Signed_External = 3,
    Signed_And_Encrypted = 4
};

typedef ByteBuffer Unsecured;
typedef ByteBuffer Signed;
typedef ByteBuffer Encrypted;
typedef ByteBuffer SignedExternal;
typedef ByteBuffer SignedAndEncrypted;
typedef boost::variant<Unsecured, Signed, Encrypted, SignedExternal, SignedAndEncrypted> Payload;
但是,处理数据类型的工作相当冗长。
也许有一种简单的方法可以实现这一点?

这里的问题是,您试图使用
typedef
来处理它不是的东西:它不声明新类型。(我认为这对于c++11可能已经改变了,因为它允许使用类型定义的模板)。如果有人能在标准中找到参考资料,我将不胜感激,但现在,请:

typedef名称是现有类型的别名,不是新类型的声明

通过执行typedef并不能得到一个新类型。也许继承可以帮助您,为您提供“真正的”新类型,但我不知道这在您的整个应用程序中是否是一个好主意。这可能是——你的问题与多态性的概念非常吻合


一般来说,C++是静态类型的,所以使用对象类型作为信息的一部分的想法可能不是最好的。通常,您可能只希望缓冲区类具有一个字段“type”,该字段引用您的
enum
,并根据该字段的值进行操作。但那只是穷人的遗产。如果您想拥有可怜的C语言继承,也可以这样做,但要将一个“做正确事情”的函数指针与缓冲区一起保存。

您可以使用强类型定义

BOOST_STRONG_TYPEDEF(SignedExternal, ByteBuffer);
其中有两个,一个在Bosot实用程序中,另一个在Boost序列化中,我记得


其中一个有更多的特性(比如提升一些操作符,比如我记得的比较/相等)。

是的,我知道使用类型作为信息不是一个好方法。但是如果我在ByteBuffer类中放入一个类型字段,我必须确保没有人设置了错误的类型。因为反序列化的整个行为都基于从字节流读取的类型。我想我将使用
struct-Signed:ByteBuffer{}
创建一个新类型。谢谢
struct SignedExternal {
    ByteBuffer buf;
}
struct Signed {
    ByteBuffer buf;
}
and so on..
BOOST_STRONG_TYPEDEF(SignedExternal, ByteBuffer);