访问矢量字段的键 - 名称空间中的枚举类或枚举?

时间:2017-08-02 10:21:40

标签: c++ c++11 vector enums enum-class

假设我有vector的别名:

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 classint类型的隐式转换,因此需要写入:

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));

这样的东西

2 个答案:

答案 0 :(得分:2)

请不要期望从简单的矢量中获得太多功能。

Vector不是用于使用索引以外的键来访问它的数据。尽管您的示例在语法和语义上都是正确的,但它们看起来像是对std::vector和枚举类的误用。每个工具都有它的用途,而矢量似乎不是你工作的最佳工具。

引入了枚举类以改善类型安全性。有了它们,您永远不会混淆PlanetDataKeysSatelliteEphemerisKeplerianOrbitElements。但是在你的情况下,你最终将它们中的任何一个转换为int,从而失去了对类型安全枚举的所有征服。

对于我来说,最好定义一个带有下标运算符的PlanetData类,该运算符接受PlanetDataKeys作为其参数。

如果你想坚持使用矢量,我会选择第一个变体(带名称空间)。它更易于阅读和编写,而且我确信它甚至比使用这种方式的枚举类更安全。

答案 1 :(得分:0)

如何定义适当类型的范围常量,如下所示:

namespace PlanetDataKeys {
  const size_t PosX = 0;
  const size_t PosY = 1;
}