如何在C++中实现真正的枚举类

nya*_*108 8 c++ enums c++11

我试图实现一个enum class行为类似于C++ 11(具有类型安全性等)引入的行为,但它也表现为一个真正的类(使用构造函数,方法等).为了做到这一点,我保持内部enum匿名:这有副作用,为了保持m_value作为private成员变量,我不得不添加一个static名为的成员变量_,如下所示:

#include <iostream>
#include <experimental/string_view>

class State
{
public:
    static enum
    {
        UNKNOWN,
        STARTED,
        STOPPED
    } _;

private:

    using Type = decltype( _ );
    Type m_value;

public:

    constexpr State( Type value = UNKNOWN )
        : m_value( value )
    { }

    constexpr bool operator==( Type value ) const
    {
        return m_value == value;
    }

    constexpr std::experimental::string_view to_string( ) const
    {
        switch ( m_value )
        {
        case UNKNOWN: return "UNKNOWN";
        case STARTED: return "STARTED";
        case STOPPED: return "STOPPED";
        }
        return "";
    }
};

State::Type State::_;

int main( )
{
    State state;
    std::cout << state.to_string( ) << std::endl;

    state = State::STARTED;
    std::cout << state.to_string( ) << std::endl;

    if( state == State::STOPPED )
    {
        std::cout << state.to_string( ) << std::endl;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法摆脱无用的static成员变量_?我想保持内部enum匿名,并在需要时以某种方式获取其类型(=仅私有).

W.F*_*.F. 13

如何简单地使用其中一个枚举值?例如:

//...
enum
{
    UNKNOWN,
    STARTED,
    STOPPED
};

private:

using Type = decltype( UNKNOWN );
//...
Run Code Online (Sandbox Code Playgroud)

[现场演示]