将char绑定到枚举类型

Bind a char to an enum type

本文关键字:枚举 类型 绑定 char      更新时间:2023-10-16

我有一段非常类似的代码:

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;
        }
    }
    }
};

现在假设我有更多的枚举类型,它们的名称更长....我得到的不是很好看的代码,我想知道是否有可能将特定的char绑定到enum类型,也许可以这样做:

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

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

不幸的是,您无法做太多的事情来清理它。如果您可以访问c++ 11强类型枚举器特性,那么您可以执行以下操作:

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

然后你可以这样做:

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

然而,如果你没有访问这个功能,那么你可以做的不多,我的建议是有一个全局映射std::map<Section, char>,它将每个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;
         }
     }
}

在这种情况下,您可以巧妙地转换字符。

enum Section{
    START = (int)'S',
    MID   = (int)'M',
    END   = (int)'E'
};
...
inline char getChar(Section section)
{
    return (char)section;
}

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

#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];
        }
    }
};