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

时间:2017-09-01 17:39:51

标签: c++ c++11 enums

我正在尝试实现一个enum class,其行为与 C ++ 11 (具有类型安全性等)一样,但它也表现为一个真正的类(带有构造函数) ,方法等)。为了做到这一点,我保持内部enum匿名:这有副作用,为了将m_value保留为private成员变量,我不得不添加{{1名为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; } 成员变量static?我想保持内部_匿名,并在必要时以某种方式获取其类型(=仅私有)。

1 个答案:

答案 0 :(得分:13)

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

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

private:

using Type = decltype( UNKNOWN );
//...

[live demo]