2017-09-01 46 views
8

我试图实现一个enum class,其行为与引入的行为类似于具有类型安全等等的,但它也表现为一个真实的类(带有构造函数,方法等)。为了做到这一点,我不停的内部enum匿名:这有副作用,就是为了保持m_value作为private成员变量,我不得不添加一个名为_一个static成员变量,你可以看到如下:如何在C++中实现一个真正的枚举类

#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匿名,并以某种方式在需要时(=仅私人)获取其类型。

+0

另见:https://stackoverflow.com/questions/28828957/enum-to-string-in-modern-c11-c14-and-future-c17-c20 – Alex

+0

你有没有考虑过使用免费功能呢? – Yakk

回答

13

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

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

private: 

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

[live demo]

+1

这真的是一个星期五。谢谢! – nyarlathotep108