gpt4 book ai didi

c++ - (反)序列化枚举类

转载 作者:行者123 更新时间:2023-11-30 02:17:02 67 4
gpt4 key购买 nike

我正在尝试序列化和反序列化(使用 QDataStream 但这与这里无关)一个 enum class变量:

enum class Type : char
{
Trivial,
Complex
};

序列化很简单:

QDataStream &operator<<(QDataStream &stream, Type type)
{
return stream << static_cast<char>(type);
}

但是反序列化不是:

QDataStream &operator>>(QDataStream &stream, Type &type)
{
return stream >> static_cast<char &>(type);
}

显然是 static_cast引用enum class不允许对其基础类型的引用。此外,“明显”的解决方案:

QDataStream &operator>>(QDataStream &stream, Type &type)
{
return stream >> reinterpret_cast<char &>(type);
}

实际上可能是非法的并且没有被标准定义according to the answer to this question因为等效表达式 return stream >> (*static_cast<char *>(static_cast<void *>(&type)));在那里被宣布为非法(或者更确切地说,标准没有定义)。如果是这样的话,我需要这样做:

QDataStream &operator>>(QDataStream &stream, Type &type)
{
char c = 0;
stream >> c;
type = static_cast<Type>(c);
return stream;
}

这不是很漂亮,是 4 行而不是 1 行等等。对于这样(看似)简单的事情,我觉得非常不必要。

我的问题:reinterpret_cast或等效 static_cast通过void*在引用 enum class 时确实是非法的(标准未定义)变量到其基础类型的引用?

最佳答案

您可以编写一个模板函数,允许您为每个 operator>> 编写 1 行您定义的。

template <class UT, class S, class E> S& DeserializeEnumClassValue(S &s, E &e)
{
UT temp;
s >> temp;
e = static_cast<E>(temp);
return s;
}

然后像那样使用它:

QDataStream &operator>>(QDataStream &stream, Type &type)
{
return DeserializeEnumClassValue<char>(stream, value);
}

但这可以使用 std::underlying_type ( https://en.cppreference.com/w/cpp/types/underlying_type ) 进行改进,因为可以在编译时获取它。

如果你采用这种方法,那么你也应该为 operator<< 做类似的事情使维护更容易。

关于c++ - (反)序列化枚举类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54055248/

67 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com