我正在从我无法控制的输入文本文件中读取值。第一行是一个整数,表示后面的行数。接下来的每一行都包含可在下一个枚举中找到的 3 个字符之一:
enum Size {
S,
M,
L
}
Run Code Online (Sandbox Code Playgroud)
ifstream 无法将值直接插入到 Size 数据类型中。因此,以下代码无法将所有值存储在数据类型Size的向量中
enum Size {
S,
M,
L
}
unsigned lines_count;
std::vector<Size> data;
file >> lines_count;
for (auto i = 0u; i < lines_count; ++i) file >> data[i]; // WRONG
Run Code Online (Sandbox Code Playgroud)
所以这些值必须存储到一个字符中。我想知道是否有一种方法可以将值直接存储到数据类型 Size 中,类似于以下内容:
unsigned lines_count;
Size size;
char c;
file >> lines_count;
for (auto i = 0u; i < lines_count; ++i) {
file >> c;
size = Size::c // c resolves to either S, M, or L
data[i] = size;
}
Run Code Online (Sandbox Code Playgroud)
我知道这个语法不起作用。我只需要最简洁的方法来完成它,而不是使用 switch 或 if 语句。
枚举具有表示枚举器的基础整数类型。您可以明确指定每个枚举器应具有哪个整数值。由于字符文字只是整数值,因此您也可以指定它们。
然后,您可以简单地从任何整型类型转换为枚举类型,以获得与该整型值对应的枚举器。这不是隐式转换,因此需要显式转换static_cast。
然而,它不会以任何方式检查这些值是否实际上是有效的枚举数之一。特别是如果超出枚举范围,如果不事先检查,则可能会导致未定义的行为,或者您可能使用范围内与任何枚举器都不匹配的值。因此,您可能无法编写一个手动检查值以进行正确输入验证的函数。
从 C++11 开始,我还会使用范围枚举。你也可以显式指定底层类型为char,那么至少不会出现上面提到的范围问题:
enum class Size : char {
S = 'S',
M = 'M',
L = 'L'
};
//...
file >> c;
// Does not validate that the value of c is one of the above!
data[i] = static_cast<Size>(c);
Run Code Online (Sandbox Code Playgroud)