Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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++ 有没有办法将枚举自动序列化为int?_C++_Serialization_Enums - Fatal编程技术网

C++ 有没有办法将枚举自动序列化为int?

C++ 有没有办法将枚举自动序列化为int?,c++,serialization,enums,C++,Serialization,Enums,有没有办法将枚举自动序列化为int?每次我定义一个新的枚举并写入 std::stringstream stream; stream << myenum1; stream >> myenum2; std::stringstream; 流>髓鞘2; 编译器抱怨未定义运算符>。您知道如何告诉编译器将枚举作为纯整数处理吗 使问题更难的是,实际上,序列化在模板中。大概是这样的: template <typename T> void serialize(const T

有没有办法将枚举自动序列化为int?每次我定义一个新的枚举并写入

std::stringstream stream;
stream << myenum1;
stream >> myenum2;
std::stringstream;
流>髓鞘2;
编译器抱怨未定义运算符>。您知道如何告诉编译器将枚举作为纯整数处理吗

使问题更难的是,实际上,序列化在模板中。大概是这样的:

template <typename T>
void serialize(const T& value)
{
    std::stringstream stream;
    stream << value;
}
模板
无效序列化(常量T和值)
{
std::stringstream;

stream您是否尝试将枚举强制转换为整数,例如使用
static_cast(enumX)

您知道如何告诉编译器将枚举作为纯整数处理吗

这是不可能的(至少对于>>),因为这将不是类型安全的(将int分配给enum不是类型安全的)


您可以做的一件事是提供运算符的重载>>和>/使用C++0x会更好,因为您可以声明底层类型(例如
unsigned short

现在,您必须使用约定,例如,假设所有枚举值都可以存储在
int
中,您可以将其序列化和反序列化为int,然后将其转换回

另一个问题当然是序列化例程:

std::stringstream stream;
stream << 1 << 2;
int a;
stream >> a;
assert(a == 12);
std::stringstream;
a流;
断言(a==12);
通常,序列化涉及使用已知大小的一些二进制表示(或将大小序列化)。如果您不想自己处理它,可以使用以下库:

  • Boost.Serialization
  • ProtocolBuffers

两者都有纯文本和二进制表示(纯文本更容易调试)。

您可以通过boost的TypeTraits()找到类型是否为enum

然后,您可以将其与
启用\u if
/
禁用\u if
结合使用:

template <class T>
typename boost::disable_if<boost::is_enum<T> >::type serialize(const T&);

template <class T>
typename boost::enable_if<boost::is_enum<T> >::type serialize(const T&); //use casts here
模板
typename boost::disable_if::type serialize(const T&);
模板
typename boost::enable_if::type serialize(const T&);//在此处使用强制转换

但是,无法检查给定值是否对给定枚举有效(除非为给定枚举类型编写特定重载).

对于输出,
我无法强制转换,因为它位于模板化代码中。我已更新了问题以使其更清楚。枚举的基本类型不一定是
int
。请检查更多详细信息。@FireAphis:您是否可以将第二种类型传递给模板,即您应该强制转换的类型?即e确切地说,我想避免的是——每次添加枚举时都添加一个运算符。难道没有通用的方法吗?使用SFINAE,您可能能够提供一些运算符模板,使用is_enum来检测枚举-请参见。这是否有效以及如何有效是我必须更加认真地思考的问题,而我目前无法做到这一点。您知道吗无法使用其他模板检查有效性trait@Autopulated:这是什么样子的?(另外,被除数的枚举常量对于枚举不是也是有效的值吗?)好的,这取决于你如何使用你的枚举,但从广义上讲,重载每种类型的特征,并在每种枚举类型中使用类似于max_值的枚举值。使用特征的优点是,你可以有一个默认值,允许接受所有内容,或者接受你喜欢的预定义范围。两年后:请注意,C++11的作用域分子不会隐式转换为

template< class E >
struct enum_traits {
    friend std::istream &operator>> ( std::istream &is, E &e ) {
        long i; // or intmax_t, whatever
        std::istream &r = is >> i;
        e = E( i );
        return r;
    }
};

enum my_enum { a, b, c };
template class enum_traits< my_enum >; // explicit instantiation
   // "matching declaration" per 7.3.1.2/3:
std::istream &operator>> ( std::istream &, my_enum & );