在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_值,接受来自终端或控制台的值以更新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 );
相关文章:
- 不带大括号的枚举形式
- 枚举环境变量的惯用C++14/C++17方法
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- 错误:从"int"到枚举c++的转换无效
- C++中构造函数中的枚举
- 访问在 C++ 结构中声明的枚举变量
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- typedef 枚举和枚举类有什么区别?
- 为什么我的开关/机箱在使用枚举时默认?
- 标准::可选枚举的比较运算符
- C++两个源文件之间共享的枚举的静态实例
- 打印没有铸件的枚举可以在C++中吗?
- 枚举成员与静态 int 成员?
- C++:枚举:错误:应使用标识符而不是"}"
- 带有 c++ 的枚举(输入检查)
- 在 qml 中使用 Q_ENUM 和 Q_PROPERTY 作为枚举类
- 在C++中显示、更新和验证枚举的值
- 定义基于模板的映射指针,以便在验证范围时将 int 解析为枚举