C++中的枚举和匿名枚举

Ins*_*der 5 c++

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)在什么情况下我更喜欢匿名枚举而不是枚举

utn*_*tim 7

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,而不是一个枚举类型.如果你需要枚举类型,那么你必须给它一个名字.否则,你没有.


tro*_*foe 0

您必须手动维护枚举值的字符串“描述”数组,这是乏味且容易出错的:

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)