Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.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++;?_C++_C++11_Enum Class - Fatal编程技术网

C++ 如何将枚举类写入文件并在C++;?

C++ 如何将枚举类写入文件并在C++;?,c++,c++11,enum-class,C++,C++11,Enum Class,我试图将类对象的内容写入文件。该对象有一个枚举类成员,我无法使用ofstream将其写入文件 我得到以下错误 error: no match for ‘operator<<’ (operand types are ‘std::basic_ostream<char>’ and ‘EnumClass_scope::EnumCass_name’) 错误:“运算符”不匹配在写入之前将变量转换为整数。读取时使用整型临时变量 std::fstream stream; enum cl

我试图将类对象的内容写入文件。该对象有一个枚举类成员,我无法使用ofstream将其写入文件

我得到以下错误

error: no match for ‘operator<<’ (operand types are ‘std::basic_ostream<char>’ and ‘EnumClass_scope::EnumCass_name’)

错误:“运算符”不匹配在写入之前将变量转换为整数。读取时使用整型临时变量

std::fstream stream;
enum class Enum { ... };

Enum variable;
stream << static_cast<int>(variable);

int temporary;
stream >> temporary;
variable = static_cast<Enum>(temporary);
std::fstream流;
枚举类枚举{…};
枚举变量;
流>临时;
变量=静态(临时);

如果定义的枚举类型不是
int
,请使用该类型。例如,使用
enum class enum:unsigned long long
,使用
static_cast

一种方法是将枚举类型强制转换为参考底图类型。这可以通过已经定义的
std::underlined_type_t
来实现,以获取枚举的内部表示

    template < typename T>
auto toUnderlayingType( T t )
{
    return static_cast<std::underlying_type_t< T >>( t );
}

    template < typename T, typename U = std::underlying_type_t< T > >
void readToEnum( U u , T& t )
{
    t = static_cast< T >( u );
}

class Y
{
    public:

        enum class X
        {
            ONE,
            TWO
        } x;

        Y(): x{X::ONE} { }

        void Print()
        {
            std::cout << toUnderlayingType(x) << std::endl;
        }

        void Read()
        {
            std::underlying_type_t< X > tmp;
            std::cin >> tmp;
            readToEnum( x, tmp );
        }
};



int main()
{
    Y y;
    y.Print();
}
模板
自动转载类型(T)
{
返回静态_cast>(t);
}
模板>
无效readToEnum(U、T&T)
{
t=静态_铸造(u);
}
Y类
{
公众:
枚举类X
{
一,,
两个
}x;
Y():x{x::ONE}{}
作废打印()
{
std::cout>tmp;
readToEnum(x,tmp);
}
};
int main()
{
Y;
y、 打印();
}
但是在序列化的情况下,使用更好的内容和数据表示形式更好。由于反射仍然不是C++的一部分,所以必须将枚举值转换为任何有用的输出和返回。也许你会在文件中写入像“一”这样的文本,而不是0。但所有这一切都是为了这个答案。有一长串序列化程序库,如和

您必须检查传入值是否有效。使用上面的示例并为其指定数字3,则枚举值无效。这里已经讨论了这个主题:

另一个选项是手动重载<代码>请提供一个。您是否重载了ostream(欢迎访问stackoverflow.com。请花一些时间阅读,特别是名为和的部分。还有请和。最后,请学习如何创建。编译器告诉您它不知道如何输出枚举。您必须提供
操作符@andreee-an
枚举
,即使使用一个演员?这不是C++。个人来说,除非我对一个特别简洁的系列化感兴趣(例如XDR标准的一些内容)。,我将使用字符串序列化
枚举
。这样,如果枚举值发生更改,任何现有序列化数据都不太可能被破坏。@andreee-常规非范围枚举都不是。指定基础类型与作用域无关。只有与基础类型的隐式转换是。而且,无论哪种方式,都是cas对基础类型的T总是有效的。假设 int < /C> >(这是C++枚举的默认值)也不是没有根据的。@andreee
enum类
被限制为整型,整型总是可以强制转换为
int
。如果您使用的类型大于
int
,您可以在编写强制转换时使用该类型。@Bathsheba-一个模糊的字符串?对于反向工程来说,感觉像是泄漏了太多的信息g目的,否则。
#include <iostream>

enum class ESomething
{
    Nothing,
    Something,
    Everything,
};

std::ostream& operator<<(std::ostream& os, const ESomething& other)
{
    switch (other)
    {
    case ESomething::Nothing:
        os << "Nothing";
        break;
    case ESomething::Something:
        os << "Something";
        break;
    case ESomething::Everything:
        os << "Everything";
        break;
    default:
        break;        
    }
    return os;
    // Alternatively: std::cout << std::underlying_type(other); return os;
}

int main()
{
    ESomething hello = ESomething::Something;
    std::cout << hello << '\n';

    return 0;
}