std::array和枚举
本节阅读量:在之前,我们讨论过,可以使用枚举作为数组的长度和索引。
既然已经了解过constexpr std::array,接下来继续讨论并展示一些额外的技巧。
使用静态断言确保适当数量的数组初始值设定项
当使用CTAD初始化constexpr std::array时,编译器将根据初始值设定项的数量推断数组的长度。如果提供的初始值设定项少于应有的数量,则数组将比预期的短,并且访问它可能导致未定义的行为。
例如:
|
|
如果需要检查constexpr std::array中的初始值设定项数量,可以使用静态断言执行此操作:
|
|
这样,如果稍后添加新的枚举器,但忘记向testScores添加相应的初始值设定项,则程序将无法编译。
您还可以使用静态断言来确保两个不同的constexpr std::array具有相同的长度。
使用constexpr数组实现更好的枚举输入和输出
在之前的I/O操作符重载简介中,我们介绍了输入和输出枚举器名称的几种方法。为了帮助完成这项任务,有了将枚举转换为字符串的辅助函数,反之亦然。这些函数都有自己的字符串文本集合,必须专门编码逻辑来检查每个函数:
|
|
这意味着如果要添加新的枚举元素,必须记住更新这些函数。
让我们稍微改进一下这些函数。在枚举器的值从0开始并按顺序继续的情况下(这对于大多数枚举都是正确的),可以使用array来保存每个枚举器的名称。
这允许我们做两件事:
|
|
这将打印:
|
|
基于范围的循环和枚举
有时,我们会遇到这样的情况,即迭代枚举元素是有用的。虽然可以使用具有整数索引的for循环来实现这一点,但这可能需要将整数索引静态强制转换为枚举类型。
|
|
不幸的是,基于范围的for循环不允许迭代枚举的枚举元素:
|
|
有许多创造性的解决方案。由于我们可以在数组上使用基于范围的for循环,因此最简单的解决方案之一是创建一个包含每个枚举元素的constexpr std::array,然后对其进行迭代。此方法仅在枚举元素具有唯一值时有效。
|
|
在上面的示例中,由于Color::types的元素类型是Color::Type,因此变量c将被推导为Color::Type,这正是我们想要的!
这将打印:
|
|
习题
定义一个名为Animal的命名空间。在其中定义一个枚举,包含下列动物:chicken、dog、cat、elephant、duck和snake。再创建一个名为Data的结构体,用来保存每种动物的名字、腿的数量和叫声。创建一个元素类型为Data的std::array,为每种动物填入一个Data元素。
要求用户输入一种动物的名字。如果这个名字与我们某种动物的名字都不匹配,就告诉用户;否则打印该动物的数据。然后打印其余没有匹配上用户输入的动物的数据。
例如:
Enter an animal: dog
A dog has 4 legs and says woof.
Here is the data for the rest of the animals:
A chicken has 2 legs and says cluck.
A cat has 4 legs and says meow.
A elephant has 4 legs and says pawoo.
A duck has 2 legs and says quack.
A snake has 0 legs and says hissss.
Enter an animal: frog
That animal couldn't be found.
Here is the data for the rest of the animals:
A chicken has 2 legs and says cluck.
A dog has 4 legs and says woof.
A cat has 4 legs and says meow.
A elephant has 4 legs and says pawoo.
A duck has 2 legs and says quack.
A snake has 0 legs and says hissss.
问题 1
查看答案
|
|