Boost::visitor 多次相同的数据类型
Boost::visitor same data types several times
我尝试从协议中实现数据结构。为了确保负载类型适合包含的数据,我有一个访问者函数来获取类型。在所有其他数据结构中,变体中使用了不同的类型,期望在有效载荷中。
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;
现在的问题是,访问者中的每种类型都是相同的(例如 Signed 是 ByteBuffer,而 Encrypted 是 ByteBuffer)。
PayloadType get_type(const Payload& payload) {
struct PayloadVisitor : public boost::static_visitor <> {
void operator()(const Unsecured& unsecured){
mtype = PayloadType::Unsecured;
}
void operator()(const Signed& sign){
mtype = PayloadType::Signed;
}
void operator()(const Encrypted& encrypted){
mtype = PayloadType::Encrypted;
}
void operator()(const SignedExternal& external){
mtype = PayloadType::Signed_External;
}
void operator()(const SignedAndEncrypted& sign){
mtype = PayloadType::Signed_And_Encrypted;
}
PayloadType mtype;
};
PayloadVisitor visit;
boost::apply_visitor(visit, payload);
return visit.mtype;
}
有什么办法可以区分不同的类型吗?
我发现它有效,如果我将它们放入如下结构:
struct SignedExternal {
ByteBuffer buf;
}
struct Signed {
ByteBuffer buf;
}
and so on..
但是使用这些数据类型就相当啰嗦了。
也许有一种简单的方法可以实现这一点?
这里的问题是您尝试将 typedef
用于它不是的东西:它 不 声明一个新类型。 (我认为对于 c++11 这可能已经改变,因为它允许使用 typedef 的模板)。如果有人能在标准中找到参考,我将不胜感激,但现在,从 cppreference.com:
The typedef-names are aliases for existing types, and are not declarations of new types.
您根本无法通过执行 typedef 来获得新类型。也许继承可能对您有所帮助,为您提供 "real" 新类型,但我不知道这对您的整个应用程序是否是个好主意。可能是——您的问题非常符合多态性的想法。
通常,c++ 是静态类型的,因此使用对象类型作为信息的一部分的想法可能不是最好的。通常,您可能只希望缓冲区 class 有一个字段 "type" 引用您的 enum
并根据该字段的值进行操作。但这只是穷人的遗产。如果你想拥有可怜的 C 人继承,做同样的事情,但保存一个 "does the right thing" 的函数指针和你的缓冲区。
你可以使用强类型定义
BOOST_STRONG_TYPEDEF(SignedExternal, ByteBuffer);
我记得有两个,一个在 Bosot Utility 中,一个在 Boost Serialization 中。
两者中的一个具有更多功能(比如提升一些运算符,比如我记得的 comparison/equality)。
我尝试从协议中实现数据结构。为了确保负载类型适合包含的数据,我有一个访问者函数来获取类型。在所有其他数据结构中,变体中使用了不同的类型,期望在有效载荷中。
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;
现在的问题是,访问者中的每种类型都是相同的(例如 Signed 是 ByteBuffer,而 Encrypted 是 ByteBuffer)。
PayloadType get_type(const Payload& payload) {
struct PayloadVisitor : public boost::static_visitor <> {
void operator()(const Unsecured& unsecured){
mtype = PayloadType::Unsecured;
}
void operator()(const Signed& sign){
mtype = PayloadType::Signed;
}
void operator()(const Encrypted& encrypted){
mtype = PayloadType::Encrypted;
}
void operator()(const SignedExternal& external){
mtype = PayloadType::Signed_External;
}
void operator()(const SignedAndEncrypted& sign){
mtype = PayloadType::Signed_And_Encrypted;
}
PayloadType mtype;
};
PayloadVisitor visit;
boost::apply_visitor(visit, payload);
return visit.mtype;
}
有什么办法可以区分不同的类型吗?
我发现它有效,如果我将它们放入如下结构:
struct SignedExternal {
ByteBuffer buf;
}
struct Signed {
ByteBuffer buf;
}
and so on..
但是使用这些数据类型就相当啰嗦了。 也许有一种简单的方法可以实现这一点?
这里的问题是您尝试将 typedef
用于它不是的东西:它 不 声明一个新类型。 (我认为对于 c++11 这可能已经改变,因为它允许使用 typedef 的模板)。如果有人能在标准中找到参考,我将不胜感激,但现在,从 cppreference.com:
The typedef-names are aliases for existing types, and are not declarations of new types.
您根本无法通过执行 typedef 来获得新类型。也许继承可能对您有所帮助,为您提供 "real" 新类型,但我不知道这对您的整个应用程序是否是个好主意。可能是——您的问题非常符合多态性的想法。
通常,c++ 是静态类型的,因此使用对象类型作为信息的一部分的想法可能不是最好的。通常,您可能只希望缓冲区 class 有一个字段 "type" 引用您的 enum
并根据该字段的值进行操作。但这只是穷人的遗产。如果你想拥有可怜的 C 人继承,做同样的事情,但保存一个 "does the right thing" 的函数指针和你的缓冲区。
你可以使用强类型定义
BOOST_STRONG_TYPEDEF(SignedExternal, ByteBuffer);
我记得有两个,一个在 Bosot Utility 中,一个在 Boost Serialization 中。
两者中的一个具有更多功能(比如提升一些运算符,比如我记得的 comparison/equality)。