如何将枚举类写入文件并使用C ++访问它?

时间:2018-06-12 07:03:42

标签: c++ c++11 enum-class

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

我收到以下错误。

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

任何线索都会有所帮助。

3 个答案:

答案 0 :(得分:2)

一种方法是将枚举类型转换为底层类型。这可以通过已定义的std::underlying_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();
}

但在序列化的情况下,使用更好的内容和数据表示更好。由于反射仍然不是c ++的一部分,因此您必须将枚举值转换为任何有用的输出并返回。也许你会在文件中写入“ONE”而不是0的文本。但这一切都是为了这个答案。有一长串序列化工具库,例如boostcerial

您必须检查传入的值是否有效。通过上面的示例并为其指定数字3,枚举值无效。这个话题已经在这里讨论了: What happens if you static_cast invalid value to enum class?

答案 1 :(得分:2)

另一种选择是为你的枚举手动重载<<运算符:

#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;
}

在哪里可以准确地决定在每个单独的案例中输出什么,或者简单地将其转换为基础类型,就像其他答案所提到的那样并输出它。选择是你的。

答案 2 :(得分:1)

在写入之前将变量转换为整数。阅读时使用整数临时变量。

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

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

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

如果您使用int以外的其他类型定义枚举,请使用该类型。例如,使用enum class Enum : unsigned long long,请使用static_cast<unsigned long long>