1)以下代码显示了星期三枚举元素的索引.如何使其打印值而不是索引.
int main()
{
enum day{sunday,monday,tuesday,wednesday,thursday,friday,saturday};
day d=wednesday;
cout<<d;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
2)在什么情况下我更喜欢匿名枚举而不是枚举
1).您的代码打印枚举的值,而不是索引.在您的特定示例中,索引与值相同(默认情况下,枚举的第一个值获取数值0,其余值获得连续增加的值.
去检查:
int main()
{
enum day{sunday = 5,monday,tuesday,wednesday,thursday,friday,saturday};
day d=wednesday;
cout<<d; // will print 8 (as in 5 + 1 + 1 + 1)
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果通过"打印值"意味着打印"星期三",你应该这样做:
enum day{sunday,monday,tuesday,wednesday,thursday,friday,saturday};
std::ostream& operator << (std::ostream& out, const day d)
{
static const char *as_strings[] = {"sunday", "monday",
"tuesday", "wednesday", "thursday", "friday", "saturday"
};
return out << as_strings[static_cast<int>(d)]; // this only works
// for enum values starting from 0 and being consecutive
// otherwise you should use a switch(d) and
// print each value separately
}
int main()
{
day d=wednesday;
cout<<d; // will print wednesday
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
2)在什么情况下我更喜欢匿名枚举而不是枚举
当您不需要将其作为参数传递时,您更喜欢匿名枚举,但需要为常量数值指定有意义的名称:
my_object record_to_myobject(record& r)
{
enum {id, value1, value2}; // indexes within record
int result_id = r[id]; // much more meaningful than r[0]
int result_value1 = r[value1];
int result_value2 = r[value2];
return my_object{result_id, result_value1, result_value2};
}
Run Code Online (Sandbox Code Playgroud)
在这里使用匿名枚举是很好的,因为在将值作为参数传递的地方,您需要一个int,而不是一个枚举类型.如果你需要枚举类型,那么你必须给它一个名字.否则,你没有.
您必须手动维护枚举值的字符串“描述”数组,这是乏味且容易出错的:
static const char *daydescs[] = {
"sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"
};
int main()
{
enum day{sunday,monday,tuesday,wednesday,thursday,friday,saturday};
day d=wednesday;
cout<< daydescs[(unsigned)d];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7352 次 |
| 最近记录: |