在C ++中显示,更新和验证枚举值

时间:2014-01-07 12:23:00

标签: c++ enums

#include <iostream>

enum SEX {MALE, FEMALE};

int main(int argc, char**argv)
{
    enum SEX the_sex = MALE;
    return 0;
}

如何在终端或控制台上显示the_sex值,接受来自终端或控制台的值以更新the_sex的值以及如何验证the_sex变量的输入?

3 个答案:

答案 0 :(得分:2)

  

如何接受来自终端或控制台的值以更新the_sex的值以及如何验证the_sex变量的输入?

输入可以用你想要的任何东西来表示:一个整数(男性为1,女性为2),char(男性为“M”,女性为“F”),{{1} }。以下是std::string版本的代码示例:

char

或者,这是char in; std::cin >> in; switch (in) { case 'M': the_sex = MALE; break; case 'F': the_sex = FEMALE; break; default: // invalid input break; } 版本:

std::string

  

如何在终端或控制台上显示the_sex值?

您只需使用std::string in; std::cin >> in; if (in == "MALE") the_sex = MALE; else if (in == "FEMALE") the_sex = FEMALE; else // invalid input 语句打印出switch变量的值:

SEX

答案 1 :(得分:2)

要输出枚举值,您只需编写

即可
std::cout << the_sex;

枚举数将显示为整数值(在本例中为1)。

获取并验证可以使用的枚举值,例如以下循环

int e;

do
{
   std::cout << "Enter the sex of the person (0 - FEMALE, 1 - MALE): ";
} while ( std::cin >> e && e != 0 && e != 1 );

if ( std::cin ) the_sex = static_cast<SEX>( e );

答案 2 :(得分:2)

我正在使用宏来执行此操作。

#define name_num(NAME, ...)                                                    \
class NAME {                                                                   \
                                                                               \
public:                                                                        \
                                                                               \
  enum   enums{NAME_NUM_BEGIN_OF_ENUM_MAP,                                     \
               __VA_ARGS__,                                                    \
               NAME_NUM_END_OF_ENUM_MAP};                                      \
                                                                               \
  using  map_type = boost::bimap<enums, std::string>;                          \
                                                                               \
  NAME(std::string const& str) {                                               \
    std::vector<std::string> v;                                                \
    boost::split(v, str, boost::is_any_of(", "), boost::token_compress_on);    \
    map_type m;                                                                \
                                                                               \
    for(int i=NAME_NUM_BEGIN_OF_ENUM_MAP+1; i!=NAME_NUM_END_OF_ENUM_MAP; i++)  \
      map_.insert(map_type::value_type(static_cast<enums>(i), v[i-1]));        \
  }                                                                            \
                                                                               \
  std::string string(enums val)        { return map_.left.at(val); }           \
                                                                               \
  enums number(std::string const& val) { return map_.right.at(val); }          \
                                                                               \
private:                                                                       \
  map_type map_;                                                               \
} NAME(#__VA_ARGS__)

它创建了一个通常的枚举列表,可以照常使用(例如在开关中)。它还使用boost bimap来映射带有相应字符串的枚举。

宏的第一个参数是类实例的名称,用于访问枚举和方法。

找到使用number的枚举并找到使用string方法的字符串。如果string(在方法编号中)没有指向有效的枚举,则会抛出std::out_of_range("bimap<>: invalid key")

请参阅this示例。