【问题标题】:How to implement a real enum class in C++如何在 C++ 中实现一个真正的枚举类
【发布时间】:2017-09-01 17:39:50
【问题描述】:

我正在尝试实现一个enum class,它的行为类似于 C++11 引入的那个(具有类型安全等),但它也表现为一个真正的类(具有构造函数、方法, ETC。)。为了做到这一点,我保留了内部 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 匿名,并在需要时以某种方式获取其类型(= 仅私下)。

【问题讨论】:

标签: c++ c++11 enums


【解决方案1】:

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

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

private:

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

[live demo]

【讨论】:

  • 这真是一个星期五。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-08-22
  • 2014-06-28
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
相关资源
最近更新 更多