【发布时间】:2017-08-02 10:21:40
【问题描述】:
假设我有一个向量的别名:
typedef std::vector<double> PlanetData;
我希望它的字段可以通过一些键访问:
double x = planet_data[PlanetDataKeys::PosX]; //planet_data is of type PlanetData
我怎样才能实现它?
我可以在命名空间中定义一个枚举:
namespace PlanetDataKeys {
enum {
PosX = 0,
PosY = 1
};
}
但是enum class 更安全:
enum class PlanetDataKeys {
PosX = 0,
PosY = 1
};
但是,由于 enum class 到 int 类型的隐式转换被禁用,这需要编写:
double x = planet_data[static_cast<int>(PlanetDataKeys::PosX)];
这有点尴尬。
在这种情况下哪种方法更好,为什么?
编辑对锯齿向量的一些解释:
在实际代码中,PlanetData 有大约 7 个字段,如果我决定扩展它可能会更多。我在解析data_string = "date: 2903248.12343, position=[124543254.1343214,123213.12341,63456.1234], velocity=[..." 形式的字符串时创建了它的一个实例。这就是为什么我希望它成为一个向量:使用类似planet_data.push_back(ParseNextDouble(data_string));
【问题讨论】:
-
enum class唯一更安全的一点是缺少从枚举到底层类型的隐式转换,这是您遇到的问题。因此我只会在命名空间中使用普通的enum。 -
@HolyBlackCat 这是唯一的事情吗?防止重新定义键不是另一个吗?
-
你真的有一个总是大小为 2 的
std::vector吗? -
@PrzemysławCzechowski 你能详细说明一下吗?如果您在谈论具有重复值的枚举器,他们seem to be allowed。
-
@bolov 不,实际上它的大小约为 7,也许更大。我想在解析数据时使用简单的
push_back放入
标签: c++ c++11 vector enums enum-class