簡體   English   中英

在C ++中顯示,更新和驗證枚舉值

[英]Displaying, updating and validating values of enum in C++

#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變量的輸入?

如何接受來自終端或控制台的值以更新the_sex的值以及如何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_sex值?

您只需使用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;
}

要輸出枚舉值,您可以簡單地編寫

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

我正在使用宏來做這件事。

#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 如果string(在方法編號中)沒有指向有效的枚舉,則拋出std::out_of_range("bimap<>: invalid key")

這個例子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM