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

How to implement a real enum class in C++

本文关键字:枚举 实现      更新时间:2023-10-16

我正在尝试实现一个像 c 11 (具有类型安全等)引入的 enum class类(带有构造函数,方法等)。为此,我保留了内部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;
}

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

简单地使用枚举值之一?例如:

//...
enum
{
    UNKNOWN,
    STARTED,
    STOPPED
};
private:
using Type = decltype( UNKNOWN );
//...

[live demo]