【问题标题】:Bind a char to an enum type将 char 绑定到枚举类型
【发布时间】:2013-06-13 19:40:53
【问题描述】:

我有一段与此非常相似的代码:

class someclass
{
public:
enum Section{START,MID,END};
vector<Section> Full;
void ex(){
    for(int i=0;i<Full.size();i++)
    {
        switch (Full[i])
        {
        case START :
                  cout<<"S";
                  break;
        case MID :
                  cout<<"M";
                  break;
        case END:
            cout<<"E";
            break;
        }
    }
    }
};

现在想象一下,我有更多的枚举类型,而且它们的名称更长...... 好吧,我得到的不是一个很好看的代码,我想知道是否可以将特定的字符绑定到枚举类型,也许可以做这样的事情:

for(int i=0;i<Full.size();i++)
    {
        cout<(Full[i]).MyChar();
    }

或任何其他可以使此代码“更漂亮”的方法。 这可能吗?

【问题讨论】:

  • 你总是可以有一个std::map&lt;Section, char&gt;,但我不确定用这么小的一组值代码会变得更干净。至少您可以将转换封装在一个函数中,以便您可以重用它。
  • std::map 在这里似乎有点矫枉过正,一个简单的数组就足够了:cout &lt;&lt; "SME"[Full[i]]。 (这仍然需要改进可管理性和安全性。)
  • 也可能是#define 标头的情况。 #define START 'S' ...

标签: c++ coding-style enums char


【解决方案1】:

不幸的是,您无能为力。如果您有权访问 C++11 强类型枚举器功能,那么您可以执行以下操作:

enum class Section : char {
     START = 'S',
     MID = 'M',
     END = 'E',
};

然后你可以这样做:

std::cout << static_cast<char>(Full[i]) << std::endl;

但是,如果您无法访问此功能,那么您无能为力,我的建议是拥有一个全局地图 std::map&lt;Section, char&gt;,它将每个 enum 部分与一个角色相关联,或者使用一个助手原型函数:

inline char SectionToChar( Section section );

这只是以更易于访问的方式实现switch() 语句,例如:

inline char SectionToChar( Section section ) {
     switch( section )
     {
     default:
         {
             throw std::invalid_argument( "Invalid Section value" );
             break;
         }
     case START:
         {
             return 'S';
             break;
         }
     case MID:
         {
             return 'M';
             break;
         }
     case END:
         {
             return 'E';
             break;
         }
     }
}

【讨论】:

  • 第一个解决方案看起来不错,不幸的是我无法访问它。
  • 我认为您需要case Section::START: 等?
  • @aschepler 不,您不需要限定非强类型全局 enum 的范围。
【解决方案2】:

在这种情况下,你可能会很棘手并施放你的字符。

enum Section{
    START = (int)'S',
    MID   = (int)'M',
    END   = (int)'E'
};

...

inline char getChar(Section section)
{
    return (char)section;
}

【讨论】:

  • 好吧,看起来它会起作用,但它“合法”吗?我的意思是它被认为是好的编程吗?
  • 合法吗,是的。它是好的编程吗.. 好吧,如果不知道您要完成什么,我无法回答。不过它更漂亮。
【解决方案3】:

我认为在这种情况下最好的解决方案是使用地图:

#include <iostream>
#include <map>
class someclass
{
    public:
    enum Section{START = 0,MID,END};
    map<Section,string> Full;

    // set using Full[START] = "S", etc

    void ex(){
        for(int i=0;i<Full.size();i++)
        {
            cout << Full[i];
        }
    }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 2011-11-01
    相关资源
    最近更新 更多