10

私はこれにかなり似たコードを持っています:

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

または、このコードを「きれい」にする他の方法。これは可能ですか?

4

3 に答える 3

19

残念ながら、これをクリーンアップするためにできることはあまりありません。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;
         }
     }
}
于 2013-06-13T19:46:26.493 に答える
5

このような状況では、トリッキーになり、チャーをキャストすることができます。

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

...

inline char getChar(Section section)
{
    return (char)section;
}
于 2013-06-13T20:17:55.287 に答える