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

Displaying, updating and validating values of enum in C++

本文关键字:验证 枚举 更新 C++ 显示      更新时间:2023-10-16
#include <iostream>
enum SEX {MALE, FEMALE};
int main(int argc, char**argv)
{
    enum SEX the_sex = MALE;
    return 0;
}

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

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

输入可以用您想要的任何内容表示:整数(1 表示男性,2 表示女性)、char("M"表示男性,"F"表示女性)、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版本:

std::string in;
std::cin >> in;
        if (in == "MALE") the_sex = MALE;
else    if (in == "FEMALE") the_sex = FEMALE;
else    // invalid input

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

您可以简单地使用 switch 语句来打印出 SEX 变量的值:

std::ostream& operator<<(std::ostream& os, SEX the_sex) { 
    switch (the_sex) {
    case MALE:
        os << "MALE";
        break;
    case FEMALE:
        os << "FEMALE";
        break;
    }
    return os;
}

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

#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方法使用的字符串。 如果字符串(在方法编号中)未指向有效的枚举,则将抛出std::out_of_range("bimap<>: invalid key")

请参阅此示例。

要输出枚举的值,您可以简单地编写

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